前端 - 一个关于JavaScript对象属性的问题,为什么根据红宝书敲出来的代码会出现奇怪的结果?
PHP中文网
PHP中文网 2017-04-10 17:19:09
0
3
765

在红宝书第六章开头部分,提到了JavaScript对象的属性分为数据属性和访问器属性,其中有两种定义属性的方法 :Object.defineProperty()Object.defineproperties(),对着书上的代码写了一遍之后,出现了奇怪的结果:

Object.defineProperty()

var book = {
    _year: 2014,
    edition: 1
};
Object.defineProperty(book,"year",{
    get: function() {
        return this._year;
    },
    set: function(newValue){
        if (newValue > 2014) {
            this._year = newValue;
            this.edition += newValue - 2014;
        };
    }
});
book.year = 2015;
console.log(book.edition); //结果为2

Object.defineProperties

var book = {};
Object.defineProperties(book,{
    _year: {
        value: 2014
    },
    edition: {
        value: 1
    },
    year: {
        get: function() {
            return this._year;
        },
        set: function(newValue) {
            if (newValue > 2014) {
                this._year = newValue;
                this.edition += newValue - 2014
            };
        }
    }
});
book.year = 2015;
console.log(book.edition);  //结果为1

请问这是为什么呢?

PHP中文网
PHP中文网

认证0级讲师

reply all(3)
PHPzhong

第二个使用 Object.getOwnPropertyDescriptor(book, 'edition') 查看下它的属性配置你会发现它的 writable 是 false 的。

https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/Object/defineProperties
文档里也详细说明了,writable 的默认值是 false。

小葫芦

嘿嘿,红宝书刚好也看到这个地方了。

你看书不仔细啊,140页下面有一句话:

在调用 Object.defindeProperty() 方法时,如果不指定,configurableenumerablewritable 特性的默认值都是 false

使用 Object.defindeProperties() 也一样,如果不指定,通过这个方法定义属性的 writable 就会是 false,不能被修改。

另:如果不使用这个方法来定义属性,那么那三个特性的默认值都为 true。所以你第一段代码直接定义的 _yearedition 是可以被修改的。

Ty80

求红宝书!!!

Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template