说我有一个类BaseClass
和两个类ClassA
,ClassB
它们继承自BaseClass
via
ClassA.prototype = Object.create( BaseClass.prototype );
我想编写一个方法,如果从 的实例调用ClassA
,则返回 的新实例,ClassA
如果从 的实例调用ClassB
,则返回 的新实例ClassB
——我想知道最好的方法是什么。目前,在摆弄之后,我想出了以下解决方案,它似乎工作得很好:
// this is added additionally to the above mentioned inheritance setup
ClassA.prototype.constructor = ClassA;
ClassB.prototype.constructor = ClassB;
BaseClass.prototype.newInstance = function () {
var constructor = this.constructor,
ClassFactory = constructor.bind.apply( constructor, [constructor].concat( [].slice.call( arguments ) ) );
return new ClassFactory();
};
明显的缺点就是覆盖了原型的构造函数,感觉不对,因为原型的构造函数其实是 BaseClass
.
另一种应该起作用的方法是覆盖的方法:
BaseClass.prototype.newInstance = function () {
throw new Error( 'Cannot call abstract method.' );
};
/** @override */
ClassA.prototype.newInstance = function () {
var ClassFactory = ClassA.bind.apply( ClassA, [ClassA].concat( [].slice.call( arguments ) ) );
return new ClassFactory();
};
// ... do the same for ClassB
现在我的问题是询问哪种策略更好,为什么,每种策略的优缺点是什么,即使有更好的方法?
编辑:为了澄清目标是什么,我想最终做这样的事情:
BaseClass.prototype.someMethod = function () {
var instance = this.getInstance();
instance.someMethod();
return instance;
};
现在,由于ClassA
并将ClassB
继承此方法,我希望它返回调用它的同一类的新实例。