如何创建与其他对象相同类型的新对象

时间:2014-02-08 05:54:59

标签: javascript inheritance

假设您在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;

1 个答案:

答案 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