2014-02-08 160 views
2

假設您在JavaScript中具有對象層次結構,其中「A」是超類,並且「B」和「C」都從它繼承。 「A」中有一些方法想要創建並返回實際上是任何類型對象的新實例。因此,如果在類型爲「B」的對象上調用對象「A」中的這些方法之一,則應該創建類型爲「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

如果你仔細restore constructors(就像你在你的例子已經這樣做),你可以叫 '新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 
相關問題