未捕获的TypeError:无法分配给只读属性

时间:2014-12-17 06:51:59

标签: javascript

我正在尝试这个非常简单的例子来自Nicholas Zakas的精彩的“Web开发者专业JavaScript”一书,但我无法弄清楚我在这里做错了什么。必须是我错过的一些非常简单的东西,但我被困住了。

以下是代码:

'use strict';

var book = {};

Object.defineProperties(book, {
    originYear: {
        value: 2004,
        writable: false
    },

    _year: {
        value: 2004
    },

    edition: {
        value: 1
    },

    year : {
        get: function() {
            return this._year;
        },

        set: function(newValue) {
            if(newValue > this.originYear) {
                this._year = newValue;
                this.edition += newValue - this.originYear;
            }
        }
    }
});

console.log(book.edition);
book.year = 2006;
console.log(book.edition);

我在Chrome控制台上遇到的错误是:

未捕获的TypeError:无法分配给#main.js的只读属性“_year”:31 Object.defineProperties.year.setmain.js:39(匿名函数)

有人可以解释我哪里出错吗?

以下是fiddle

4 个答案:

答案 0 :(得分:35)

当您使用Object.defineProperties时,默认情况下writable设置为false,因此_yearedition实际上只读属性。

明确地将它们设置为writable: true

_year: {
    value: 2004,
    writable: true
},

edition: {
    value: 1,
    writable: true
},

查看MDN for this method

  

<强> writable
  true当且仅当与属性关联的值可以使用赋值运算符更改时   默认为false

答案 1 :(得分:0)

我尝试将year更改为其他术语,并且有效。

public_methods : {
    get: function() {
        return this._year;
    },

    set: function(newValue) {
        if(newValue > this.originYear) {
            this._year = newValue;
            this.edition += newValue - this.originYear;
        }
    }
}

答案 2 :(得分:0)

如果有时a link!不管用。 因此,创建一个临时对象并从可写对象中获取所有值,然后更改该值并将其分配给可写对象。应该完美。

var globalObject = {
    name:"a",
    age:20
}
function() {
    let localObject = {
    name:'a',
    age:21
    }
    this.globalObject = localObject;
}

答案 3 :(得分:-5)

book.year.writable = true;
book.year = New Value;