2014-09-04 93 views
1

我想知道是否有可能通過自動使用超類的構造函數實例化JavaScript中的子類。
考慮這個(由this other question here on SO啓發):繼承和使用超類的構造函數在javascript中

function A(prop) { 
    this.prop = prop; 
} 
A.prototype.whatAmI = function() { 
    console.log(
     "I'm an instance of %s, my prop is %s", 
     this instanceof A1? "A1" : "A2", 
     this.prop 
    ); 
}; 

function A1() { 
    A.apply(this, arguments); 
} 
A1.prototype = new A(); 
A1.prototype.constructor = A1; 

function A2() { 
    A.apply(this, arguments); 
} 
A2.prototype = new A(); 
A2.prototype.constructor = A2; 

var a1 = new A1("foo").whatAmI(); //I'm an instance of A1, my prop is foo 
var a2 = new A2("bar").whatAmI(); //I'm an instance of A2, my prop is bar 

然而,參考this article,在第一個例子中我碰到這行代碼來:

Cat.prototype.constructor = Cat; 
//Otherwise instances of Cat would have a constructor of Mammal 

我想這正是我需要的: A1A2的實例具有A的構造函數。不幸的是註釋掉A1.prototype.constructor = A1和排空A1的身體(這同樣適用於A2)不工作:

function A1() {} 
A1.prototype = new A(); 

function A2() {} 
A2.prototype = new A(); 

var a1 = new A1("foo").whatAmI(); //I'm an instance of A1, my prop is undefined 
var a2 = new A2("bar").whatAmI(); //I'm an instance of A2, my prop is undefined 

最後,改變A的構造函數使用arguments對象,而不是明確地傳遞prop沒有影響之一:

function A() { 
    this.prop = arguments[0]; 
} 

這是甚至可能的,有點擺弄prototype屬性,實現我想要的?

+0

你爲什麼要清空機構?只是不要重置構造函數,你應該得到你想要的結果。 – PlantTheIdea 2014-09-04 18:40:03

回答

4
Cat.prototype.constructor = Cat; 
//Otherwise instances of Cat would have a constructor of Mammal 

我想這正是我需要的:即A1和A2 的實例有A.

號的構造,這不是他們的意思。 A1A2函數仍然是他們自己的構造函數被調用,你不能改變它。

了本文介紹的問題是,.constructor財產所有實例繼承指出其構造不再有效時,您覆蓋AX.prototype。另請參閱What is the `constructor` property really used for?(和鏈接的問題)。

不幸的是註釋掉A1.prototype.constructor = A1和 清空A1的身體(這同樣適用於A2)不起作用。

通過清空身體,它不再做任何事情。你仍然需要明確地打電話A,你不會得到解決。你可以做的是創建一個通用的工廠,創建A的子類別,並不做任何特別的事情,但我認爲這不值得。

哦,不要忘記:You should not use new for creating prototypes

subclass(parent) { 
    function Child() { 
     parent.apply(this, arguments); 
    } 
    Child.prototype = Object.create(parent.prototype); 
    Child.prototype.constructor = Child; 
    return Child; 
} 

function A(prop) { 
    this.prop = prop; 
} 
A.prototype.whatAmI = function() { 
    console.log(
     "I'm an instance of %s, my prop is %s", 
     this instanceof A1? "A1" : "A2", 
     this.prop 
    ); 
}; 
var A1 = subclass(A), 
    A2 = subclass(A); 
+0

謝謝,這是一個非常明確和徹底的答覆。乾杯。 :) – 2014-09-04 20:05:07