2011-10-07 21 views
0

我是一位經驗豐富的編碼人員,首次使用Douglas Crockford的「Javascript:The Good Parts」一書學習JavaScript。在書中,他建議使用一個「純粹的原型」的方式來繼承,使用此功能:在JavaScript中使用純原型方法時如何處理對象屬性

​​

我遇到的問題是,當一個對象具有的對象,而不是一個簡單的類型,創建一個屬性一個新對象繼承父對象的實例,而不是創建一個新對象。例如:

var aBody = { 
    arms : 2, 
    legs : 2 
}; 

var person = { 
    name : 'Jeff', 
    body : Object.create(aBody) 
}; 
document.writeln('Person '+person.name+' has '+person.body.arms+' arms and '+person.body.legs+' legs.'); 

var cat = Object.create(person); 
cat.name = 'Bob'; 
cat.body.arms = 0; 
cat.body.legs = 0; 

document.writeln('Cat '+cat.name+' has '+cat.body.arms+' arms and '+cat.body.legs+' legs.'); 
document.writeln('Now person '+person.name+' has '+person.body.arms+' arms and '+person.body.legs+' legs.'); 

這有輸出:

Person Jeff has 2 arms and 2 legs. 
Cat Bob has 0 arms and 0 legs. 
Now person Jeff has 0 arms and 0 legs. 

我得到了簡單的「名」屬性預期的行爲,而不是爲「體」。我想我明白了 - 因爲JavaScript是通過引用複製的,所以不會產生新的實例。我每次用person創建一個對象時,都可以手動執行此操作。 cat.body = Object.create(aBody)但我還沒有設法找到一個乾淨的方式滾動到原始對象定義(這裏,person)。

我真的很感謝你可以提供的任何指導,因爲我正在學習編寫漂亮,清晰,可靠的JS代碼。有人使用'純原型'方法來解決這個問題有一個聰明的技巧嗎?

回答

1

原型對象的要點是提供一個放置類全局屬性的地方。因此,您看到的行爲實際上是原型繼承旨在支持的功能。

如果您不希望實例共享屬性,請將屬性直接放在實例上。

我想概括瓦罐的函數來檢查的intialization方法:

if (typeof Object.create !== 'function') { 
    Object.create = function(o) { 
     var F = function() {}; 
     F.prototype = o; 
     var obj = new F(); 
     if (o.init && typeof o.init === 'function') 
      o.init.call(obj); 
     return obj; 
    }; 
} 

不,你可以修改「aBody」:

var aBody = { 
    init: function() { 
    this.body = { arms: 2, legs: 2 }; 
    } 
}; 

當您創建與該情況下,他們將有自己的擁有「身體」財產。

相關問題