2014-05-08 92 views
1

分配對象原型的建議方法/模式是什麼?爲'super'function指定一個已經實例化的實例,或者爲每個'sub'function初始化一個新的'super'實例?如果多種方法很常見,每個的優點/缺點是什麼?JavaScript原型分配

function SuperFoo(){ }; 
function Foo() {}; 
function Fooy() {}; 
function Fooimus() {}; 
function Foolacious() {}; 


/* Option 1: */ 
var proto = new SuperFoo(); 
Foo.prototype = proto; 
Fooy.prototype = proto; 
Fooimus.prototype = proto; 
Foolacious.prototype = proto; 


/* Option 2: */ 
Foo.prototype = new SuperFoo(); 
Fooy.prototype = new SuperFoo(); 
Fooimus.prototype = new SuperFoo(); 
Foolacious.prototype = new SuperFoo(); 
+0

關於這一主題Crockford的寫了應該對你有所幫助: http://www.crockford.com/javascript/inheritance.html –

+0

這取決於你想達到什麼。在這個狀態下,這個問題太廣泛了。 –

回答

4

多種方法是司空見慣的。但是一般來說,人們真正想要做的事情並沒有被你列出的任何解決方案所覆蓋。

你一般要在一個子類什麼是構造方法的prototype屬性是一個對象,它本身從父類的構造的prototype財產繼承。確保原型構造函數正確匹配也是一個好主意:原型應該具有指向它自己的類構造函數的constructor屬性。其結果可能是這樣的:

function SuperFoo() {}; // assuming that some prototype functions are already defined. 

function Foo() {}; 
Foo.prototype = Object.create(SuperFoo.prototype); 
Foo.prototype.constructor = Foo; 

我通常的解決辦法現在是包裝這一rigamarole成一個功能,像這樣:

Object.subclass = function (sub, sup) { 
    sub.prototype = Object.create(sup.prototype); 
    sub.prototype.constructor = sub; 
}; 

function SuperFoo() {}; // assuming that some prototype functions are already defined. 

function Foo() {}; 
Object.subclass(Foo, SuperFoo); 

function Fooy() {}; 
Object.subclass(Fooy, SuperFoo); 

function Fooimus() {}; 
Object.subclass(Fooimus, SuperFoo);  

function Foolacious() {}; 
Object.subclass(Fooalicious, SuperFoo);