2015-04-04 74 views
0

的所有實例和問題對象的原型,我在圍繞原型繼承在網絡上搜索來顯示原型分配到構造函數之前它的名字,就像下面的代碼:分配後創建

Object.beget = function (o) { 
    var F = function() {}; 
    F.prototype = o; 
    return new F(); 
}; 

我的問題是,有沒有辦法來改變對象不是構造函數)的原型已經在這樣我可以訪問新的原型方法,而直接調用它的方式被instatiated後,或在換句話說,在這種方式下,物體繼承其新原型方法

編輯:

我想這個問題的重點可能不是很清楚,我沒有興趣在提高對象的原型,我真正想要的是分配一個新的原型的方式,在不改變其他具有與第一個相同的原型的物體。

+0

而不是試圖劫持單個實例的原型,只是創建一個新的對象實例。 – zzzzBov 2015-04-04 18:51:16

+0

@zzzzBov這將工作,但我不想傳遞前一個對象所有的值到新的。 – Roger 2015-04-04 18:58:05

+0

這就是爲什麼看到「擴展」方法的常見原因。 [jQuery有一個](http://api.jquery.com/jQuery.extend/),[下劃線也是這樣](http://underscorejs.org/#extend)。 – zzzzBov 2015-04-04 19:44:02

回答

1

有沒有辦法改變對象的原型後,它已經instatiated?

是的,有:Object.setPrototypeOf(僅ES6)的Object.getPrototypeOf對方 - 這訪問對象真實的原型,而不僅僅是.prototype財產。還有.__proto__ getter/setter property(不贊成使用)也會這樣做(請參閱Quick Javascript inheritance: Understanding __proto__)。

但是,請注意,這通常是一個可怕的想法。不僅因爲可能有engines that don't support these,而且它還擊敗了引擎使用實例的所有優化優化:Why is mutating the [[prototype]] of an object bad for performance?

+0

這正是我需要的,非常感謝你的回答和參考文獻@Bergi – Roger 2015-04-04 19:51:01

0

您可以指定新的屬性到原來的對象,O,以及新的對象實例會自動訪問這些屬性:

Object.beget = function (o) { 
    var F = function() {}; 
    F.prototype = o; 
    return new F(); 
}; 

var o = { 
    a: 1 
}; 

var instance = Object.beget(o); 

instance.a === o.a; // true 

o.b = function() {}; 

instance.b === o.b; // true 
+0

可能的重複其實,我的懷疑是另一種方式,我不想要爲了增強以前的原型,我想完全改變一個**對象**原型而不改變具有相同原型的其他對象的原型。 – Roger 2015-04-04 18:43:07

0

如果與創建對象後,該對象的變化相關聯的原型(其中意味着所有來自前一個原型鏈的屬性應該被刪除並添加新的屬性),是不是等同於用這個新原型創建一個新對象的實例?在這種情況下,爲什麼不創建一個新對象並使用它呢?

如果我缺少任何用例,請讓我知道。

+0

正如我在另一篇評論中提到的那樣,創建一個新對象的解決方案是可行的,但它與'劫持'對象的原型不同,因爲以前的對象屬性的所有值都必須轉移到新的對象,除此之外創建新實例的開銷。 – Roger 2015-04-04 19:12:12