将defineProperty与对象一起用作值

时间:2014-07-15 11:32:29

标签: javascript object properties defineproperty

简短问题:我可以在defineProperty调用中使用对象作为值吗?目前我遇到的问题是类的所有实例共享同一个对象。

小例子:

  var Test = function () {
  };

  var p = Test.prototype;

  Object.defineProperty(p, 'object', {
    value: new TestObject(),
    enumerable: true,
    writeable: false
  });

一个简单的测试用例:

  var x = new Test();
  var y = new Test();

  y.object.test = 'Foobar';

  console.log(x.object.test); // --> Foobar

目前我必须以这种方式解决这个问题:

  var Test = function () {
    this.initialize();
  };

  var p = Test.prototype;

  p._object = null;

  p.initialize = function () {
    this._object = new TestObject();
  };

  Object.defineProperty(p, 'object', {
    get: function () { return this._object; },
    enumerable: true
  });

可以在没有额外属性的情况下获得解决方案吗?

1 个答案:

答案 0 :(得分:0)

只需将defineproperty从Test prototype definition移动到Test definition,就可以在构造函数调用中创建一个新的TestObject实例:

var TestObject = function() { }

var Test = function () {
    if(this==window) throw "Test called as a function";
    Object.defineProperty(this, 'object', {
      value: new TestObject(),
      enumerable: true,
      writeable: false
    });
};

一个简单的测试用例

var x = new Test();
var y = new Test();

x.object.test = 'Foo';
y.object.test = 'Bar';

console.log(x.object.test, y.object.test); // Foo Bar

see the fiddle