我很新使用object.create而不是傳統的js方式來實現原型繼承。Object.create設置__proto__但不是原型
在Chrome中,至少我很驚訝地看到下面的代碼:
var baseObject = {
test : function(){
console.log('Child');
}
}
var newObject = Object.create(baseObject);
newObject.test = function(){
console.log('Parent');
this.__proto__.test();
}
console.log(newObject);
newObject.test();
產生以下(模擬的Web工具的輸出):
Object {test: function, test: function}
test: function(){
__proto__: Object
test: function(){
__proto__: Object
Parent
Child
所以你看它不設置原型,但而不是隻有「__proto__」,我認爲它的使用是不鼓勵的。你可以看到,在我的代碼中,我可以正確地繼承,並調用父對象,但只能使用「__proto__」。使用「原型」會導致錯誤(未定義)。
這是怎麼回事嗎?我想object.create會設置「原型」,因爲這是標準(或我所假設的)。爲什麼填充並使我使用「__proto__」
非常有趣。你是對的,我忘了原型只適用於功能。所以基本上,至少是鉻,使用__proto__類型的複製原型以非標準方式用於計劃對象? – nahelm 2013-03-05 21:44:12
@nahelm:排序。 '__proto__'可以讓你給現有的對象一個新的原型鏈。構造函數和Object.create只是讓你在創建對象時進行設置。從那裏它是永久的。事實上,如果你從構造函數中創建一個對象,那麼你給構造函數一個新的'.prototype'對象,你創建的對象仍然會引用原始對象。它永遠不會改變。 – 2013-03-05 21:47:13
我想我終於明白了。我的一部分困惑是,我期望我的網絡工具在Chrome中顯示我創建的對象的原型。我也想過一些愚蠢的理由,即使用new關鍵字可以使用prototype關鍵字(在你的例子中是f.prototype),這是不正確的。當我做了你的Foo例子並在其原型中添加了一個函數時,當我使用console.log(f)時,該函數也顯示在__proto__對象中。因此,本質上__proto__暴露了通常隱藏的原型鏈,正如您所說的永久鏈接。 – nahelm 2013-03-06 22:07:46