【问题标题】:Wrong behaviour in Google Chrome Object.defineProperty?Google Chrome Object.defineProperty 中的错误行为?
【发布时间】:2013-10-13 19:27:49
【问题描述】:

我正在尝试使用 setter 和 getter 创建一个对象,这是我的代码:

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);

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

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

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

是我做错了什么,还是这是一个错误?这发生在 Google Chrome 版本 30.0.1599.66

【问题讨论】:

  • 错误似乎是描述性的......为什么你会有一个不可写属性的getter和setter?
  • writable: truewritable: false 这两种情况下都会显示错误。这不是很奇怪吗?
  • 您只能拥有属性writablevaluegetset,不能混合使用它们。由于您指定了writable,因此您不能使用getset。见Mozilla MDN
  • 哦,那是有道理的。这个评论应该是一个答案,所以我可以接受它

标签: javascript google-chrome defineproperty


【解决方案1】:

Object.definePropertyMozilla MDN 阐明了这一点:

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

这意味着,您可以使用其中任何一种:

  • writablevalue
  • getset

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

【讨论】:

    猜你喜欢
    • 2010-12-08
    • 2011-05-17
    • 2017-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-02
    相关资源
    最近更新 更多