2011-07-25 28 views
2

使用javascript,您可以讓一個對象從另一個對象繼承屬性,以便如果在第一個對象上找不到屬性,則會搜索第二個對象。通過在構造函數上重新指定prototype屬性,可以創建許多對象的鏈來搜索屬性。一個構造函數的屬性可能被另一個構造函數繼承嗎?

例如:

var X = function() {}; 
X.prototype.x = "x"; 

var Y = function() {}; 
Y.prototype = new X(); 
Y.prototype.y = "y"; 

var z = new Y(); 
z.z = "z"; 

/////////////// 

console.log(z.z); // searches z for property 'z', finds it and returns 'z' 

console.log(z.y); // searches z, fails, searches z.[[hidden_prototype]] 
        // (which is Y.prototype), finds it and returns 'y' 

console.log(z.x); // searches z, fails, searches Y.prototype, fails, 
        // searches Y.prototype.[[hidden_prototype]] 
        // (which is X.prototype), finds it and returns "x" 

我想知道雖然它是否有可能延伸到性能上的構造函數,即XY在上面的代碼。例如,有沒有辦法來改變上面的代碼,這樣下也將工作:

X.val = 42; 

console.log(Y.val); // returns 42 

這工作,如果Y.[[hidden_prototype]] === X,但我不知道如何設置,當XY還必須構造函數。

回答

1

根據第一相關link

你可以這樣做:

function Y(){} 
function X(){} 
Y.__proto__=X; 
X.val=42; 
console.log(Y.val);//42 

雖然它顯然不是標準

+0

謝謝,這就是我想知道的,當我輸入問題時沒有看到相關的鏈接。通過它的外觀,可能的答案列表是由不僅標題的內容更新的,而且還包括文本的內容 - 在輸入問題後應再次檢查它:) –

+2

您不應該使用非標準的,不推薦的__proto__屬性。它沒有得到廣泛的支持,將來會從支持它的瀏覽器中刪除。 – RobG

0

可以使用首先由拉塞Reichstein的尼爾森,並制定了克隆功能由道格拉斯克羅克福德推廣爲「beget」:

var clone = (function() { 
    var f = function(){}; 
    return function(obj) { 
    f.prototype = obj; 
    return new f(); 
    } 
}()); 

要設置X爲Y [[原型]]:

function X(){} 
var Y = clone(X); 

然而ý將是一個對象,而不是函數。函數只能由Function構造函數創建。 ECMA-262定義瞭如何創建新的函數,因爲函數必須繼承自Function.prototype和Object.prototype,所以不能影響它使用哪個對象作爲[[Prototype]]對象,所以它不能只允許任何要作爲[[Prototype]]插入的對象。