设置者可以修改不可写/不可配置的属性吗?

时间:2015-11-11 20:39:47

标签: javascript oop getter-setter

我一直在阅读有关属性属性(可配置,可写,可枚举)的内容,并且正在寻找有关setter如何与不可写/不可配置属性交互的一些说明。

具体而言,如果使用Object.defineProperty()定义属性,则默认为configurable: falsewritable: false。在这种情况下,同一对象中的setter函数是否仍然能够修改属性的值?

这是我正在看的例子:

var book = {};

Object.defineProperties(book, {
    _year: {
        value: 2004
    },
    edition: {
        value: 1
    },
    year: {
        get: function(){
            return this._year;
        },
        set: function(newValue){
            if (newValue > 2004) {
                this._year = newValue;
                this.edition += newValue - 2004;
            }
        }
    }
});

- 来自"针对网络开发人员的专业JavaScript,第3版。" (Nicholas C Zakas)

因此,book.year的setter部分旨在更新book._year的值。

但由于book._year是使用Object.defineProperty定义的,并且未明确设置为可写或可配置,因此不应该是可修改的?或者同一个对象中的函数(即book.year)是否被排除在这些限制之外?

值得注意的是,当我在浏览器中运行时,这段代码给了我一些有趣的结果......即: book.year = 2005book.yearbook._year不执行任何操作 book.year(2005)会产生TypeError: book.year is not a function

1 个答案:

答案 0 :(得分:0)

自我属性没有关于writable true / false的排除。如果您拥有非writable属性,则无法从您想要的任何地方进行更改。当您可以将描述符更改为可写时,除了可配置的值。

关于TypeError的另一个问题:
使用`defineProperty`在属性定义中的setter函数是一个隐藏方法,在分配属性时调用。这不是外面的实际功能。

You can see it's execution by debugging when you assign a value to this property