Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/421.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 设置程序能否修改不可写/不可配置的属性?_Javascript_Oop_Getter Setter - Fatal编程技术网

Javascript 设置程序能否修改不可写/不可配置的属性?

Javascript 设置程序能否修改不可写/不可配置的属性?,javascript,oop,getter-setter,Javascript,Oop,Getter Setter,我一直在阅读有关属性属性(可配置、可写、可枚举)的文章,希望了解setter如何与不可写/不可配置属性交互 具体地说,如果使用Object.defineProperty()定义属性,它将默认为可配置:false和可写:false。在这种情况下,同一对象中的setter函数是否仍然能够修改属性的值 这就是我正在看的例子: var book = {}; Object.defineProperties(book, { _year: { value: 2004 },

我一直在阅读有关属性属性(可配置、可写、可枚举)的文章,希望了解setter如何与不可写/不可配置属性交互

具体地说,如果使用
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
。是这样吗?