使用Object.create时,无法通过setter设置对象属性

时间:2013-03-21 08:19:56

标签: javascript object setter

在我尝试了解有关Object.create的更多信息时,我遇到了Object.create(): the New Way to Create Objects in JavaScript

上页的一个例子:

var Car2 = Object.create(null); //this is an empty object, like {}
Car2.prototype = {
  getInfo: function() {
    return 'A ' + this.color + ' ' + this.desc + '.';
  }
};

var car2 = Object.create(Car2.prototype, {
  //value properties
  color:   { writable: true,  configurable:true, value: 'red' },
  //concrete desc value
  rawDesc: { writable: false, configurable:true, value: 'Porsche boxter' },
  // data properties (assigned using getters and setters)
  desc: { 
    configurable:true, 
    get: function ()      { return this.rawDesc.toUpperCase();  },
    set: function (value) { this.rawDesc = value.toLowerCase(); }  
  }
}); 
car2.color = 'blue';
alert(car2.getInfo()); //displays 'A blue PORSCHE BOXTER.'

问题:

  1. 上述示例有多正确? This answer似乎与上面的例子相矛盾。它似乎给出了rawDesc可能是私有成员的概念,只能通过{{1}的getter / setter修改}。这有用吗?

  2. 此外,尝试使用desc设置desc的值似乎不起作用。为什么会这样?

  3. Object.defineProperty和Object.create的哪些部分相似?

  4. 研究:

    有些相关的问题:Why can I set [enumerability and] writability of unconfigurable property descriptors? 我尝试删除car2.desc = 'Merc'writable: false并尝试设置值但无效。

1 个答案:

答案 0 :(得分:0)

一些意见:

var Car2 = Object.create(null); //this is an empty object, like {}

评论不太正确。 Car2的内部原型(即其[[Prototype]])将为null,因此它不会继承Object.prototype的任何属性,而使用{}创建的对象确实。

Car2.prototype = {
  ...
};

var car2 = Object.create(Car2.prototype, {

创建Car2似乎毫无意义,因为它不是一个函数,不能用作构造函数,也不能继承任何标准的Object方法。它只是分配给Car2.prototype的对象的占位符。但我想这只是一个例子。

对于问题......

  

上面的例子有多正确?这个答案似乎与上面的例子相矛盾。

这与例子有什么矛盾?

  

另外,尝试使用car2.desc ='Merc'为desc设置值似乎不起作用。为什么会这样?

因为desc的设置器实际更改了rawDesc,但rawDesc设置为writeable: false。将其更改为writeable: true并更改值。但无论如何它都是一个公共财产,因此通过设置其他财产来设置其价值有点毫无意义。

  

Object.defineProperty和Object.create的哪些部分相似?

Object.createObject.defineProperty在ECMA-262中相邻,并不难解决。基本上,第一个只是向现有对象添加属性,第二个创建一个新对象并设置其[[Prototype]](即它等同于构造函数)。

相关问题