指向同一对象的CoffeeScript对象属性

时间:2014-04-06 14:46:03

标签: javascript oop coffeescript

我有一个类,我想用于两个单独的对象。该类有一个属性 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 = {}

1 个答案:

答案 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'

并且会影响原型值而不是修改它。