2012-02-09 84 views
0

如果我在對象的構造函數外聲明基礎原型對象,則所有創建的對象都基於該單個基礎對象,這不適合我的需要,因爲我需要基礎對象的多個實例。JavaScript原型繼承 - 這是做事的正確方式嗎?

總之:這段代碼是否正確?它的工作原理,但我很挑剔有正確的代碼。

例子:

function BaseObject() 
{ 
    BaseObject.prototype.insertObject = function()… 
    … 
    … // Some other functions. 
} 

function Object1() 
{ 
    Object1.prototype = new BaseObject(); 

    Object1.prototype.coolFunction = function()… 
    … 
    … // Same kind of pattern. 
} 

function Object2() 
{ 
    Object2.prototype = new Object1(); 

    Object2.prototype.incredibleFunction = function()… 
    … 
    … // You get the idea. 
} 

回答

0

沒有,所有這些都是目前裏面你的構造函數的代碼應該是他們之外。現在,每當有人創建新對象時,您都將重新分配原型的這些屬性。

最後,良好做法的要點:

  • 你總是要「修正」任何派生原型constructor財產。這是JS繼承的怪癖;它會被覆蓋。人們很少依賴constructor屬性是正確的,但有時他們會這樣做,如果不這樣做,就會感覺錯誤。
  • Object.create(Base.prototype)new Base()更好,如果您在支持它的瀏覽器中工作或使用es5-shim。它只是實例化對象,而不是創建它,這很好,因爲您不需要實際的對象副本來執行原型繼承。

這一切看起來像:

function BaseObject() { } 

BaseObject.prototype.insertObject = function() { }; 

function Object1() { } 

Object1.prototype = Object.create(BaseObject.prototype); 
Object1.prototype.constructor = Object1; 
Object1.prototype.coolFunction = function() { }; 

function Object2() { } 

Object2.prototype = Object.create(Object1.prototype); 
Object2.prototype.constructor = Object2; 
Object2.prototype.incredibleFunction = function() { }; 
+0

如果我做'Object1.prototype =新BaseObject();'在構造函數之外,從Object1創建的每個對象都依賴於BaseObject的單個實例。我需要一種方法來創建BaseObject的新實例。 – user1092719 2012-02-09 19:46:18

+0

即使您在構造函數中執行它,情況依然如此。 'Object1'的每個實例都共享Object1.prototype,因此每次重新分配Object1時,所做的每件事情都是使每個Object1實例都依賴於同一個新構建的原型BaseObject。 – Domenic 2012-02-09 19:48:20

+0

但是,當我在我的實際代碼中這樣做時,它的工作原理與我需要的一樣,因爲每次構造函數被調用時,都會將該對象上的原型設置爲「BaseObject」的新創建實例,然後重複該模式並它工作正常。有一個乾淨和正確的方法來做到這一點。 – user1092719 2012-02-09 19:56:11

0

的一般模式:

function Base (baseMember) { 
    this.baseMember = baseMember; 
} 

Base.prototype.baseFunc = function() {}; 

function Derived (baseMember, derivedMember) { 
    Base.apply(this, arguments); 
    this.derivedMember = derivedMember; 
} 

Derived.prototype = Object.create(Base.prototype); 
Derived.prototype.constructor = Derived; 

Derived.prototype.derivedFunc = function() {}; 

這是醜陋的,我知道......