setter 可以修改 non-writable/non-configurable 属性吗?

Can setters modify non-writable/non-configurable properties?

我一直在阅读有关 属性 属性(可配置、可写、可枚举)的内容,并且正在寻找有关 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;
            }
        }
    }
});

-- 来自 "Professional JavaScript for Web Developers, 3rd Ed." (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

没有关于 writable true/false 自属性的排除。如果你有一个非 writable 属性 那么就没有办法从你想做的地方改变。当您可以将描述符更改为可写时的可配置值除外。

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