0

在尝试了解有关 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. 上面的例子有多正确?这个答案似乎与上面的例子相矛盾。它似乎给出了一个概念,即rawDesc可能是一个只能通过 getter/setter of 修改的私有成员desc。这有什么用吗?

  2. 此外,尝试设置desc使用值car2.desc = 'Merc'似乎不起作用。为什么呢?

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

研究:

有点相关的问题:为什么我可以设置不可配置属性描述符的[可枚举性和]可写性? 我尝试删除writable: falsevalue: 'Porsche boxter'尝试设置该值,但无济于事。

4

1 回答 1

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。但我想这只是一个例子。

对于问题......</p>

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

它如何与示例相矛盾?

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

因为 setter fordesc实际上发生了变化rawDesc,但rawDesc被设置为writeable: false. 将其更改为writeable: true并更改值。但无论如何它是一个公共属性,所以通过设置其他属性来设置它的值有点毫无意义。

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

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

于 2013-03-21T09:10:46.353 回答