我搞砸了一些“经典”继承,并且遇到了一个问题。我正在使用Object.defineProperty()向我的LivingThing“类”添加属性。我想要一个默认值,以及一个属性 getter / setter 。

http://jsfiddle.net/fmpeyton/329ntgcL/

我遇到以下错误:

Uncaught TypeError: Invalid property.  A property cannot both have accessors and be writable or have a value, #<Object>

为什么会出现此错误?使用Object.defineProperty()为属性设置默认值和getter / setter的最佳方法是什么?

最佳答案

使用函数范围的变量来支持定义的属性,并将该变量的初始值设置为默认值:

function LivingThing(){
    self = this;
    var isAlive = true;

    Object.defineProperty(self, 'isAlive', {
        get: function(){
            return isAlive;
        },
        set: function(newValue){
            isAlive = newValue;
        },
        configurable: true
    });

    self.kill = function(){
        self.isAlive = false;
    };
}

http://jsfiddle.net/329ntgcL/5/

不需要writable,因为您有二传手。这就是导致您出错的原因。您可以具有值/可写(数据描述符)或获取/设置(访问器描述符)。

结果,当您调用var l = new LivingThingl.isAlive == true以及在您调用l.kill()l.isAlive == false之后

08-06 01:30