search

Home  >  Q&A  >  body text

前端 - 一个关于JavaScript对象属性的问题,为什么根据红宝书敲出来的代码会出现奇怪的结果?

在红宝书第六章开头部分,提到了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中文网2819 days ago795

reply all(3)I'll reply

  • PHPz

    PHPz2017-04-10 17:21:09

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

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

    reply
    0
  • 高洛峰

    高洛峰2017-04-10 17:21:09

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

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

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

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

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

    reply
    0
  • PHP中文网

    PHP中文网2017-04-10 17:21:09

    求红宝书!!!

    reply
    0
  • Cancelreply