![](/img/trans.png)
[英]Which properties are stored in which object in Javascript prototyping?
[英]How to handle object properties when using the pure prototyping approach in JavaScript
我是一位經驗豐富的編碼人員,第一次使用Douglas Crockford的“ Javascript:The Good Parts”一書學習JavaScript。 在其中,他建議使用“純原型”方法進行繼承,並使用以下功能:
if (typeof Object.create !== 'function') {
Object.create = function(o) {
var F = function () {};
F.prototype = o;
return new F();
};
}
我遇到的問題是,當一個對象的屬性是對象而不是簡單類型時,創建一個新對象會繼承該對象的父實例,而不是創建一個新實例。 例如:
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.
我得到了簡單的'name'屬性的預期行為,但沒有得到'body'的預期行為。 我想我理解-因為JavaScript是通過引用復制的,所以不會產生新的aBody實例。 每當我使用cat.body = Object.create(aBody)
從person
創建對象時,我都可以手動執行此操作,但是我沒有設法找到一種巧妙的方法將其轉換為原始對象定義(此處為person
)。
我非常感謝您提供的任何指導,因為我正在嘗試學習編寫美觀,清晰,可靠的JS代碼。 人們是否使用“純原型”方法來解決此問題的巧妙技巧?
原型對象的全部目的是提供一個容納類全局屬性的地方。 因此,您看到的行為實際上就是原型繼承旨在支持的功能。
如果您不希望實例共享屬性,則將屬性直接放在實例上。
我將推廣Crock的函數以檢查初始化方法:
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 };
}
};
當您使用它創建實例時,它們將具有自己的“ body”屬性。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.