Я хочу проверить, реализует ли объект x миксин MyInterface (является его экземпляром):

Ext.define('MyInterface', {
    interfaceMethod: Ext.emptyFn
});

Ext.define('Foo', {
    mixins: {
        myInterface: 'MyInterface'
    }
});

var x = new Foo();

Не работает работает:

console.log(x instanceof MyInterface);

Уродливое решение:

var isInstanceOfMyInterface = false;
for (var i in x.mixins) {
    if (x.mixins[i].$className == 'MyInterface') {
        isInstanceOfMyInterface = true;
    }
}
console.log(isInstanceOfMyInterface);

У обходного пути есть одна серьезная проблема: он не работает, если используется подкласс MyInterface.

jsfiddle

2
Niko Sams 27 Май 2014 в 19:01

2 ответа

Лучший ответ

Шаблон, который использует ядро ​​Ext, заключается в применении определенного свойства миксина, чтобы вы могли проверить его существование. Это намного дешевле, чем экземпляр чека. Например:

Ext.define('MyInterface', {
    isMyInterface: true,
    interfaceMethod: Ext.emptyFn,
});

Ext.define('Foo', {
    mixins: {
        myInterface: 'MyInterface'
    }
});

var x = new Foo();
console.log(x.isMyInterface);
5
Evan Trimboli 30 Май 2014 в 08:37

Миксины решают проблему множественного наследования, потому что нет способа заставить класс C наследовать как от A, так и от B в простом JavaScript. Затем логика состоит в том, чтобы позволить классу C наследовать от A и использовать класс B как миксин. Примесь B - это своего рода хранилище дополнительных методов и свойств для C.

Когда миксин B используется в классе C, все его методы и свойства копируются в прототип C, а когда создается экземпляр C, он содержит свои собственные методы, методы A, потому что он наследуется от A, и B, потому что добавляются методы mixin к нему.

Кроме того, C может использовать более одного миксина для добавления дополнительных методов / свойств. Использование mixin не меняет имя класса целевого класса, C остается C.

Внутри Ext используемые миксины хранятся как объект в объекте mixins целевого класса в виде пар имя / значение.

Подводя итог, ваш способ уже является прекрасным способом проверить, использует ли класс миксин, тем не менее, его можно улучшить:

  1. вы можете реализовать приведенный выше код как метод класса (ов), который вы хотите проверить
  2. вы можете нарушить приведенный выше вид, как только миксин будет найден, чтобы сэкономить несколько циклов
0
Saki 30 Май 2014 в 05:42