我有一个类,我想用于两个单独的对象。该类有一个属性 myvar ,它本身就是一个对象。每个对象应该是不同的。但是,在所有实例化对象中, myvar 属性指向同一个对象,请参阅下面的代码。如何为每个对象提供唯一/私有 myvar 属性?
class Test
myvar: {}
obj = new Test
obj2 = new Test
obj.myvar['key'] = 'value'
console.log obj.myvar # Result: { key: 'value' } / Correct
console.log obj2.myvar # Result: { key: 'value' } / Incorrect! Expected {}!
编译JavaScript:
// Generated by CoffeeScript 1.6.3
(function() {
var Test, obj, obj2;
Test = (function() {
function Test() {}
Test.prototype.myvar = {};
return Test;
})();
obj = new Test;
obj2 = new Test;
obj.myvar['key'] = 'value';
console.log(obj.myvar);
console.log(obj2.myvar);
}).call(this);
更新。我找到了一个可能的“解决方案”:将所有作为对象的属性放入构造函数中,如下所示。有更好的解决方案吗?
class Test
constructor: ->
@myvar = {}
答案 0 :(得分:1)
不,没有比在构造函数中设置实例变量更好的解决方案:
class Test
constructor: ->
@myvar = {}
类定义中的任何内容都附加到原型上,因此它们像原型中的其他所有实例一样被所有实例共享。快速浏览一下JavaScript可能会有所帮助:
var Test;
Test = (function() {
function Test() {}
Test.prototype.myvar = {};
return Test;
})();
您可以安全地将不可变的东西(例如字符串,数字和布尔值)放在类定义中,但不能放入可变值。例如,这很好:
class C
s: 'pancakes'
因为更改s
的唯一方法是完全替换它:
c = new C
c.s = 'house'
并且会影响原型值而不是修改它。