簡體   English   中英

在JavaScript中使用純原型方法時如何處理對象屬性

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM