我正在尝试创建一个主对象,我可以创建多个实例,每个实例都继承子项(具有唯一/隔离属性).但是,当我这样做时,对象的属性(在被更改之后)正在改变所有创建的对象.我可能没有正确解释这个,但这个例子应该很清楚.
Main = function(){}; // Extending the main class with new object. Doing it this way so I can have these in // separate files. Main.prototype.foo = { bar: 1 } // First instance of Main(). var A = new Main(); // Second instance of Main(). var B = new Main(); // Set the bar property to different values for each Main() object. A.foo.bar = 2; B.foo.bar = 3; // Both A.foo.bar and B.foo.bar return 3. alert(A.foo.bar); alert(B.foo.bar);
我想要发生的是A.foo.bar返回2和B.foo.bar返回3,这样我就有了彼此独立的孤立对象.
有任何想法吗?我只是错过了一些明显的东西吗?非常感谢!
解决方法
“foo”属性位于原型对象上,并且只有其中一个属性.当您通过任何实例设置它时,您正在影响同一个共享属性.
您可以在构造函数中添加实例属性:
function Main() { this.instanceProperty = 1; }
然后那将是每个实例.
原型不是“主模板”或类似的东西;这是一个真实的对象.它不会复制到实例上.相反,运行时知道它在那里,并且当对实例上实际不存在的实例上的属性进行引用时,它知道走向原型链并在那里寻找属性.