我已经创建了集合基类/对象来执行重复任务。我有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();
})();
答案 0 :(得分:3)
分配给原型的任何属性都在使用该原型的所有对象之间共享(因为原型对象本身在所有实例之间共享)。这对于原型上的函数(例如方法)非常有用,但它通常对数据属性不利,因为(正如您所发现的),所有实例共享相同的数据属性,这不是您通常想要的。
处理此问题的常用方法是在构造函数中分配数据属性,而不是在原型中。这会为对象的每个新实例创建一个新的数据变量。
function CollectionBase(){
// create new value property for each instance
this.value = [];
}