2013-05-15 63 views
3

假設我有一個具有手動設置的原型屬性的對象。這是將一個對象原型複製到另一個對象的安全方法嗎?

一個例子是

function A() { 

}; 

A.prototype.B = function() { 

}; 

A.prototype.C = function() { 

}; 

A.prototype.D = function() { 

}; 

如何延長與A的原型另一個對象?

我試過的是這個;

// obj = extend to object 
// obj2 inherit from object 

for (var prop in obj2.prototype) { 
      if (obj2.prototype.hasOwnProperty(prop)) { 
       obj.prototype[prop] = obj2.prototype[prop]; 
      } 
     } 

是否使用obj2.hasOwnProperty(prop)確保只有上A的原型的屬性,我將會被複制?

有沒有更好的方法來做到這一點?

+0

什麼是obj2的?和A一樣嗎? – sh0ber

+0

是的,obj2將在示例 – user2251919

+0

這應該按預期工作,您正確使用hasOwnProperty。如果你的目標只是從一個對象的原型到另一個對象的淺拷貝,那麼沒有更好的方法。 – sh0ber

回答

0

通常,嘗試和模仿其他語言的模式到Javascript中並不總是可取的。 Javascript使用原型繼承,而不是標準的OO繼承(比如你在Java中所做的)。是的,你可以將方法從一個原型複製到另一個,但並不總是可取的,因爲你真的把內部物體的封裝吹出水面。如果您想要複製方法,只需將一個對象原型設置爲與另一個對象相同即可。

這裏是做繼承

// object we want to inherit from 
function bar() {} 
bar.prototype.original = function() {} 

// object which will inherit bar 
function foo() {} 
// first map prototypes 
foo.prototype = new bar(); 

// add additional methods to foo 
foo.prototype.somethingElse = function() {} 

而不是做new bar()你可以做Object.create(bar),因爲一些評論者所指出的那樣一個模式,但不是在IE8和下方支撐。兩者之間唯一的功能區別在於新的bar()將執行bar的構造函數,而後者不會,這對您而言可能並不重要。 Object.create()在技術上是更正確的方法,但可以成爲一個交易斷路器,除非你願意失去IE8或使用墊片。

這裏是另一種模式,我的首選,使用成分代替

// object we want to inherit from 
function bar() {} 
bar.prototype.original = function() {} 

function foo() { 
    this.bar = new bar(); 
} 
foo.prototype.somethingElse = function() { 
    // foo has a bar, but isn't a bar 
    this.bar.original(); 
} 
+0

@apsillers哎呀,你是對的,我將它更新爲新的bar(),然後確保新的foo()和新的bar()產生不同的簽名。 – Nucleon

+0

@Nucleon:不,不要使用'new bar()'作爲原型對象! – Bergi

+0

爲什麼?以下是Google使用其確切模式的地圖API示例:https://developers.google.com/maps/documentation/javascript/examples/overlay-simple。 'USGSOverlay.prototype = new google.maps.OverlayView();'。如果這種方法有什麼問題,我很想知道。 – Nucleon

相關問題