0

我试图找到一种方法来初始化附加到具有本地化值引用的 JavaScript 伪类的所有实例的属性值,而无需手动迭代每个实例,例如以下代码:

function A() {
    this.a = '0';
}

var a = new A();
var b = new A();

document.write(a.a + a.b + a.c + '<BR />');

A.prototype.b = '1';
Object.defineProperty(A.prototype, 'c', {
    writable: true,
    value: (function() { return(this.a + '|'); })()
});

document.write(a.a + a.b + a.c + '<BR />');

b.c = '3';

document.write(a.a + a.b + a.c + '<BR />');
document.write(b.a + b.b + b.c + '<BR />');

输出:

0undefinedundefined
01undefined|
01undefined|
013

但在所需条件下会输出:

0undefinedundefined
010|
010|
013

编辑:

为澄清起见,该值应初始化为通过“this”访问的对象的属性。当属性附加到对象时,不会在 get 或 set 调用中以延迟方式进行,也不会使用其他本地属性。

4

2 回答 2

1

如果您希望能够访问this,则不能使用valuewritable描述符选项。您将需要使用getset。在这种情况下,由于您希望分配的值优先于默认值,因此由您来执行该逻辑。

Object.defineProperty(A.prototype, 'c', {
    get: function(){
      // If an overridden values was provided, then return that instead.
      if ('_c' in this) return this._c;
      return (this.a + '|');
    },
    set: function(val){
      this._c = val;
    }
});
于 2013-02-24T19:06:28.587 回答
1

您似乎想要一个动态计算a属性值的 getter 函数:

Object.defineProperty(A.prototype, 'c', {
    get: function() {
        return(this.a + '|');
    },
    set: function(x) { // overwritable:
        // create normal property directly on the object (not on the prototype)
        Object.defineProperty(this, 'c', {
            value: x,
            writable: true
        });
    }
});

您当前的代码就像

A.prototype.c = (function() { return(this.a + '|'); })(); // IEFE

this全局对象在哪里a,当然是未定义的。

于 2013-02-24T20:17:36.050 回答