2016-10-10 81 views
-1

我在firefox中使用以下代碼來設置兩個對象之間的原型繼承關係。原型從對象繼承到另一個

var a={}; 
var b={}; 

b.__proto__=a; 
a.dosomething=function(){ 
    alert ('ok'); 
}; 
b.dosomething();//ok 

,但它僅適用於火狐由於只是Firefox提供。

在其他網絡瀏覽器,如果A,B使用的是一些構造函數創建的,我可以用

b.constructor.prototype=a; 

設置的繼承關係。

但在上面的情況下,a,b的構造函數都是Object。 我無法更改Object的原型。

有沒有辦法設置繼承關係,除了使用原型

您的評論歡迎

+0

你是不是指'__proto__'? – Oriol

+0

是的,它是__proto__ – arachide

+0

在上面的代碼中,你是不是將b設置爲原型? 在下面的代碼中,你爲什麼要做'b.constructor.prototype = a'而不是'b.prototype = a'? 你也是正確的對象是js中的母親原型,我只是想要更好地理解這個問題。 –

回答

1

您可以使用Object.create。它創建一個對象,其原型是傳遞給它的對象。

var a = {}; 
 
var b = Object.create(a); 
 

 
a.dosomething = function() { 
 
    alert ('ok'); 
 
}; 
 
b.dosomething(); // ok

您還可以使用Object.setPrototypeOf對於已經存在的對象。你真的,真的應該不是這樣做,如果你可以避免它。它導致嚴重的性能問題。

var a = {}; 
 
var b = {}; 
 

 
Object.setPrototypeOf(b, a); 
 

 
a.dosomething = function() { 
 
    alert ('ok'); 
 
}; 
 
b.dosomething(); // ok

+0

只用於創建新的b(新對象),如果a和b存在,我可以設置繼承關係嗎? – arachide

+0

@arachide是的。看我的編輯。 –

+0

太棒了!非常感謝 – arachide

2

不要改變現有對象的原型。

警告:改變對象的[[Prototype]]是,現代化的JavaScript引擎如何優化屬性訪問,非常 操作慢性質 ,在瀏覽器和JavaScript引擎。對改變遺傳性能的 影響是細微的 遙遠,而不僅限於簡單地 obj.__proto__ = ...聲明中所花費的時間,而且可以延伸到任何代碼 訪問任何對象的[[Prototype]]已被更改。 如果你關心性能,你應該避免設置一個對象的 [[Prototype]]。相反,請使用Object.create()創建一個新對象,其中 需要[[Prototype]]

如果你這樣做,標準的方式是Object.setPrototypeOf,而不是__proto__

正確的方法是

var a = {}; 
 
var b = Object.create(a); 
 
a.dosomething = function(){ 
 
    console.log('ok'); 
 
}; 
 
b.dosomething();

b.constructor.prototype = a;做法是沒用的。如果b是構造函數C的實例,那麼該代碼只會影響在更改後構建的實例,而不會影響b