javascript原型继承覆盖属性

javascript原型继承覆盖属性,javascript,inheritance,prototype,Javascript,Inheritance,Prototype,我已经创建了集合基类/对象来执行重复的任务。我有CollectionBase,还有继承到CollectionBase的Persons类。但我的问题是,当我创建像persons1=new persons()和persons2=new persons()这样的2个人集合时,它们似乎具有相同的引用对象。任何关于我如何使每次我将创建一个新的人,它将创建新的实例的建议 请在plnkr上参考此信息; (功能(){ Persons.prototype=Object.create(CollectionBase

我已经创建了集合基类/对象来执行重复的任务。我有CollectionBase,还有继承到CollectionBase的Persons类。但我的问题是,当我创建像persons1=new persons()和persons2=new persons()这样的2个人集合时,它们似乎具有相同的引用对象。任何关于我如何使每次我将创建一个新的人,它将创建新的实例的建议

请在plnkr上参考此信息;

(功能(){

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


})()

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

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

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

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

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

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

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

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

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

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

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

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


公平地说,这对原始人来说没什么。造成问题的是对象类型,因为它们永远不会被重新分配。即使对于数组,也可以使用原型,就像从子对象执行a=['a','b']时一样,它不会查找原型链,而是直接在子对象中创建一个新属性(如果尚未存在),并为其分配值。@T.J.Crowder-是,您可以将原语放在原型上,但要理解当您将新值赋给原语(最初在原型上)时会发生什么,这无疑是一个微妙的过程。如果您只是在构造函数中初始化每个实例的原语,那么您就不会面临这种细微差别-生活只是简单一些。@Aravind-如果您只是修改对象,例如
this.a.push(“Hello”);那么将原型与任何对象(包括数组)一起使用将不是每个实例的变量这会让不了解细节的人(比如OP)感到困惑。是的,为属性分配一个全新的数组是可行的,但是为什么要让自己暴露在修改和分配工作不同的复杂环境中呢。很少有好的理由让你的代码变得如此复杂。@jamesemanon-你必须展示一个更完整的代码示例(通过编辑你的问题并将其插入你可以格式化的地方),我才能理解这个场景。一般来说,原型上的任何数组都将由使用该原型的所有对象共享。公平地说,对于原型来说,这很好。造成问题的是对象类型,因为它们永远不会被重新分配。即使对于数组,也可以使用原型,就像从子对象执行a=['a','b']时一样,它不会查找原型链,而是直接在子对象中创建一个新属性(如果尚未存在),并为其分配值。@T.J.Crowder-是,您可以将原语放在原型上,但要理解当您将新值赋给原语(最初在原型上)时会发生什么,这无疑是一个微妙的过程。如果您只是在构造函数中初始化每个实例的原语,那么您就不会面临这种细微差别-生活只是简单一些。@Aravind-如果您只是修改对象,例如
this.a.push(“Hello”);那么将原型与任何对象(包括数组)一起使用将不是每个实例的变量这会让不了解细节的人(比如OP)感到困惑。是的,为属性分配一个全新的数组是可行的,但是为什么要让自己暴露在修改和分配工作不同的复杂环境中呢。很少有好的理由让你的代码变得如此复杂。@jamesemanon-你必须展示一个更完整的代码示例(通过编辑你的问题并将其插入你可以格式化的地方),我才能理解这个场景。一般来说,原型上的任何数组都将由使用该原型的所有对象共享。公平地说,对于原型来说,这很好。造成问题的是对象类型,因为它们永远不会被重新分配。即使对于数组,也可以使用原型,就像从