javascript原型继承覆盖属性

时间:2014-11-10 06:30:46

标签: javascript inheritance prototype

我已经创建了集合基类/对象来执行重复任务。我有CollectionBase,我有继承到CollectionBase的Persons类。但我的问题是,当我创建2人集合时,如person1 = new Persons()和persons2 = new Persons(),似乎他们有相同的参考对象。任何关于我如何能够每次创建的建议我将创建一个新的人,它将创建新的实例。

请参考plnkr; http://plnkr.co/edit/8GPkWO4nKRiskxoRWrkg?p=info

(函数(){

    function CollectionBase(){
    this.collection = [];
}

Object.defineProperties(CollectionBase.prototype, {
    count: {
        get: function(){
            return this.collection.length;
        },
        enumerable: true
    }
});

CollectionBase.prototype.init = function(){
};

CollectionBase.prototype.get = function(index){
    if (index === undefined){
        return this.collection;
    }
    return this.collection[index];
};

CollectionBase.prototype.remove = function(index){
    try{
        if (index === undefined) throw new Error('index is undefined');
        this.collection.splice(index, 1);
    }
    catch(err){
        console.log(err);       
    }
};

CollectionBase.prototype.update =function(item){
};

CollectionBase.prototype.add = function(item){  
    this.collection.push(item);
};


function Person(firstName, lastName){
    this.firstName = firstName;
    this.lastName = lastName;
}

function Persons(){
    CollectionBase.call(this);
}

Persons.prototype = Object.create(CollectionBase.prototype);

var persons1 = new Persons();
var persons2 = new Persons();

})();

1 个答案:

答案 0 :(得分:3)

分配给原型的任何属性都在使用该原型的所有对象之间共享(因为原型对象本身在所有实例之间共享)。这对于原型上的函数(例如方法)非常有用,但它通常对数据属性不利,因为(正如您所发现的),所有实例共享相同的数据属性,这不是您通常想要的。

处理此问题的常用方法是在构造函数中分配数据属性,而不是在原型中。这会为对象的每个新实例创建一个新的数据变量。

function CollectionBase(){
   // create new value property for each instance
   this.value = [];
}