检查对象是否是mixof的实例

时间:2014-05-27 15:01:57

标签: extjs

我想检查对象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的子类,它就不起作用。

jsfiddle

2 个答案:

答案 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的好方法,无可挑剔,可以改进:

  1. 您可以将上述代码实现为您要检查的类的方法
  2. 一旦发现mixin可以节省一些周期,你可以打破上面的样子