我想检查对象x
是否实现了mixin MyInterface
的实例(<1}}:
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的子类,它就不起作用。
答案 0 :(得分:4)
Ext核心使用的模式是应用mixin特定属性,以便您可以测试它的存在。它比支票实例便宜很多。例如:
Ext.define('MyInterface', {
isMyInterface: true,
interfaceMethod: Ext.emptyFn,
});
Ext.define('Foo', {
mixins: {
myInterface: 'MyInterface'
}
});
var x = new Foo();
console.log(x.isMyInterface);
答案 1 :(得分:0)
Mixins解决了多重继承的问题,因为在纯JavaScript中无法使C类继承A和B.然后逻辑让C类继承自A并使用B类作为mixin。 mixin B是C的其他方法和属性的一种存储库。
当在C类中使用mixin B时,其所有方法和属性都被复制到C的原型中,当C被实例化时,它包含自己的方法,A的方法,因为它继承自A和B,因为mixin的方法被添加到它。
此外,C可以使用多个mixin来添加其他方法/属性。使用mixin不会更改目标类的类名,C保持C。
Ext内部使用的mixins作为目标类的mixins
对象中的对象保存为名称/值对。
总结一下,你的方式已经是检查一个班级是否使用mixin的好方法,无可挑剔,可以改进: