Google Chrome Object.defineProperty中的错误行为

Wrong behaviour in Google Chrome Object.defineProperty?

本文关键字:错误 Chrome Object defineProperty Google      更新时间:2023-09-26

我正在尝试创建一个带有setters和getters的对象,这是我的代码:

var Player = function(height){
    var _height = height;
    Object.defineProperty(this, 'height', {
      enumerable: false
    , configurable: true
    , writable: false
    , get: function(){return _height;}
    , set: function(val){_height = val;}
    });
}

var myPlayer = new Player(10);

即使定义属性选项的writable属性设置为 false,我也会收到以下错误:

Invalid property. A property cannot both have accessors and be writable or have a value, #<Object>

当然,当writable设置为 true 时也会发生同样的情况,但是如果我删除writable行,错误就会消失。

我做错了什么,还是这是一个错误?这发生在谷歌浏览器版本30.0.1599.66

Mozilla MDN for Object.defineProperty 澄清了这一点:

对象中存在的属性描述符有两种主要形式:数据描述符和访问器描述符。数据描述符是具有值的属性,该值可能是可写的,也可能是不可写的。访问器描述符是由一对 getter-setter 函数描述的属性。描述符必须是这两种风格之一;它不能两者兼而有之。

这意味着,您可以使用其中之一:

  • writablevalue
  • getset

但是您不能使用它们的任何组合。在您的示例中,您指定 writable 属性,这意味着它是一个数据描述符,不允许getset属性。