假设您在javascript中有一个对象层次结构,其中“A”是超类,“B”和“C”都继承自它。你在“A”中有一些方法想要创建并返回它实际上是什么类型的对象的新实例。因此,如果对象“A”中的这些方法之一在类型为“B”的对象上调用,它应该创建一个类型为“B”的新对象并将其返回,但显然对象“A”不知道关于“B”的任何事情(不应该)。
那么,如何创建一个与其他对象相同类型的对象,而不管它是什么类型(如invert
方法中所示)?
代码示例:
function A() {
// constructor logic here
}
A.prototype = {
invert: function() {
// question: how do I create an object here that is the same
// type as whatever this object is (could be A, B or C)
}
};
// -------------------------
// B - subclass of A
function B() {
// call A superclass constructor
A.apply(this, arguments);
}
B.prototype = new A();
B.prototype.constructor = B;
// methods of B
B.prototype.negate = function() {
// method of subclass
}
// -------------------------
// C - subclass of A
function C() {
// call A superclass constructor
A.apply(this, arguments);
}
C.prototype = new A();
C.prototype.constructor = C;
答案 0 :(得分:1)
如果您仔细restore constructors(就像您在示例中所做的那样),您可以调用'new this.constructor()':
function A () {
this.label = 'A';
}
A.prototype = {
constructor: A,
quux: function () {
return new this.constructor(/*ctor args here*/);
}
};
function B () {
this.label = 'B';
}
B.prototype = new A();
B.prototype.constructor = B;
function C () {
this.label = 'C';
}
C.prototype = new A();
C.prototype.constructor = C;
console.log(new A().quux().label); // prints A
console.log(new B().quux().label); // prints B
console.log(new C().quux().label); // prints C