Javascript 设置程序能否修改不可写/不可配置的属性?
我一直在阅读有关属性属性(可配置、可写、可枚举)的文章,希望了解setter如何与不可写/不可配置属性交互 具体地说,如果使用Javascript 设置程序能否修改不可写/不可配置的属性?,javascript,oop,getter-setter,Javascript,Oop,Getter Setter,我一直在阅读有关属性属性(可配置、可写、可枚举)的文章,希望了解setter如何与不可写/不可配置属性交互 具体地说,如果使用Object.defineProperty()定义属性,它将默认为可配置:false和可写:false。在这种情况下,同一对象中的setter函数是否仍然能够修改属性的值 这就是我正在看的例子: var book = {}; Object.defineProperties(book, { _year: { value: 2004 },
Object.defineProperty()
定义属性,它将默认为可配置:false
和可写: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;
}
}
}
});
--摘自“面向Web开发人员的专业JavaScript,第三版”(Nicholas C Zakas)
因此,book.year
的setter部分用于更新book.u year
的值
但是由于book.\u year
是使用Object.defineProperty
定义的,并且没有明确设置为可写或可配置,所以不应该修改吗?或者同一对象(即book.year
)中的函数是否以某种方式被排除在这些限制之外
还值得注意的是,当我在浏览器中运行此代码时,它给了我一些有趣的结果。。。即:
book.year=2005
对book.year
或book.\u year
没有任何影响,并且
book.year(2005)
导致TypeError:book.year不是函数
对于自身属性,writeable
true/false没有排除。如果您有一个非可写的
属性,那么无论您想从哪里更改它都是不可能的。当您可以将描述符更改为可写时,可配置值除外
关于TypeError的另一个问题:使用“defineProperty”的属性定义中的setter函数是一个隐藏方法,在指定属性时调用。这不是来自外部的实际功能
对于自身属性,
writeable
true/false没有排除。如果您有一个非可写的
属性,那么无论您想从哪里更改它都是不可能的。当您可以将描述符更改为可写时,可配置值除外
关于TypeError的另一个问题:使用“defineProperty”的属性定义中的setter函数是一个隐藏方法,在指定属性时调用。这不是来自外部的实际功能
您能否澄清一下,或者让我向您的消息来源询问您答案中的“没有排除”部分?我仍然不清楚为什么示例中的setter(假定)能够更改不可写的
\u年,或者为什么我在尝试运行代码时遇到类型错误。我的意思是,您可以更改不可写属性,只要将可写:false
更改为可写:true
,如果它是可配置的。没有其他办法改变这种财产。我像前面一样做了一个屏幕截图来显示,当setter以值3005
执行时,那么this.\u year
正在赋值,但没有写入,(this.\u year=3005
不工作,因为它是不可写的),因此您无法写入此属性的任何内容。关于您的错误:set、get函数是一个隐藏函数,当您指定一个值时,它们正在执行,比如'book.year=3005',然后setter函数正在调用year`是一个属性,而不是一个方法,所以你得到了一个错误,你是说这个例子是错误的——给定的代码实际上没有提供一种方法来改变。\u year
。是这样吗?你能澄清一点吗?或者让我到你的消息来源那里了解你答案中的“没有排除”部分?我仍然不清楚为什么示例中的setter(假定)能够更改不可写的\u年,或者为什么我在尝试运行代码时遇到类型错误。我的意思是,您可以更改不可写属性,只要将可写:false
更改为可写:true
,如果它是可配置的。没有其他办法改变这种财产。我像前面一样做了一个屏幕截图来显示,当setter以值3005
执行时,那么this.\u year
正在赋值,但没有写入,(this.\u year=3005
不工作,因为它是不可写的),因此您无法写入此属性的任何内容。关于您的错误:set、get函数是一个隐藏函数,当您指定一个值时,它们正在执行,比如'book.year=3005',然后setter函数正在调用year`是一个属性,而不是一个方法,所以你得到了一个错误,你是说这个例子是错误的——给定的代码实际上没有提供一种方法来改变。\u year
。是这样吗?