setter 可以修改 non-writable/non-configurable 属性吗?
Can setters modify non-writable/non-configurable properties?
我一直在阅读有关 属性 属性(可配置、可写、可枚举)的内容,并且正在寻找有关 setter 如何与不可写/不可配置属性交互的说明。
具体来说,如果使用 Object.defineProperty()
定义 属性,它将默认为 configurable: false
和 writable: 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 = 2005
对 book.year
或 book._year
没有任何影响,并且
book.year(2005)
结果为 TypeError: book.year is not a function
。
没有关于 writable
true/false 自属性的排除。如果你有一个非 writable
属性 那么就没有办法从你想做的地方改变。当您可以将描述符更改为可写时的可配置值除外。
关于 TypeError 的另一个问题:
属性 定义中的 setter 函数使用 `defineProperty` 是一个隐藏方法,当您分配 属性 时调用。这不是来自外部的实际功能。
我一直在阅读有关 属性 属性(可配置、可写、可枚举)的内容,并且正在寻找有关 setter 如何与不可写/不可配置属性交互的说明。
具体来说,如果使用 Object.defineProperty()
定义 属性,它将默认为 configurable: false
和 writable: 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 = 2005
对 book.year
或 book._year
没有任何影响,并且
book.year(2005)
结果为 TypeError: book.year is not a function
。
没有关于 writable
true/false 自属性的排除。如果你有一个非 writable
属性 那么就没有办法从你想做的地方改变。当您可以将描述符更改为可写时的可配置值除外。
关于 TypeError 的另一个问题:
属性 定义中的 setter 函数使用 `defineProperty` 是一个隐藏方法,当您分配 属性 时调用。这不是来自外部的实际功能。