6

作为 javascript 的初学者,我试图从这里理解 Object.create() 方法

https://developer-new.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Object/create

在示例代码中,第 18 行。创建了一个访问器属性,并将 writable 设置为 true。我还读到可写仅适用于数据描述符。

试过跑步,

var o = Object.create(Object.prototype, {
  // foo is a regular "value property"
  foo: { 
    writable:true, configurable:true, value: "hello" 
  },
  // bar is a getter-and-setter (accessor) property
  bar: {
    writable: true,
    configurable: false,
    get: function() { return 10 },
    set: function(value) { console.log("Setting `o.bar` to", value) }
  }
  });
console.log(o); 

我明白了invalid property error

4

2 回答 2

12

问题是writableset/get是互斥的。该代码在 Chrome 中生成了这个有用的错误:

Invalid property. A property cannot both have accessors and be writable...

这具有一定的逻辑意义:如果您在某个属性上有set/get访问器,则该属性将永远不会被写入和/或读取,因为任何读取/写入它的尝试都将被访问器函数拦截。如果您将属性定义为writable 为其提供访问器函数,那么您同时在说:

  1. “可以直接更改此属性的值”,并且
  2. “阻止所有读取和/或写入此属性的尝试;相反,请使用这些函数。”

该错误只是阻止您指定矛盾。我假设您编写了一个 getter 和 setter,您并不真正希望该属性为writable. 只需删除该行,您的代码就会完美运行。

于 2012-07-27T04:50:16.487 回答
10

迟到的答案,不是在寻找选票,但希望这会有所帮助。

有两种性质。每个属性都是:

  1. 具有以下四个属性的数据属性:

    • 价值
    • 可写
    • 可枚举的
    • 可配置
  2. 或具有以下四个属性的访问器属性:

    • 得到
    • 可枚举的
    • 可配置

因此,没有属性可以同时具有getwritable。这就是 JavaScript 的方式!有关详细信息,请参阅ECMAScript 标准的第 8.6 节。

于 2012-07-27T05:40:34.253 回答