2013-03-21 40 views
0

在尝试了解Object.create时,我遇到了Object.create(): the New Way to Create Objects in JavaScript使用Object.create时无法通过setter设置对象属性

从上面的页面的一个例子:

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可能是一个私人成员,只能通过desc的getter/setter修改的概念。这有用吗?

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

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

研究:

有点相关的问题:Why can I set [enumerability and] writability of unconfigurable property descriptors? 我试图消除writable: falsevalue: 'Porsche boxter',并试图设定值,但无济于事。

回答

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,因为它不是一个函数,不能被用来作为构造也没有继承任何的标准对象的方法。它只是分配给Car2.prototype的对象的占位符。但我想这只是一个例子。

而对于问题...

如何正确的是上面的例子?这个答案似乎与上面的例子相矛盾。

它与示例矛盾吗?

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

因为对于desc的setter实际上改变rawDesc,但rawDesc设置为writeable: false。将其更改为writeable: true并且值已更改。但无论如何这是一个公共财产,因此通过设置其他财产来设定其价值有点毫无意义。

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

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

+0

谢谢,它确实是一个复制粘贴的例子,正如问题中提到的。至于与矛盾的例子,我想我误解了'rawDesc'和desc是同一个属性。只是乍一看,这个例子看起来提供了一种私有成员的方法,即在这种情况下,'rawDesc'只能通过'desc'来访问。顺便说一句@RobG任何机会,你都是同一个人(Rob Gravelle)写这篇文章的同一个例子[这里](http://www.htmlgoodies.com/beyond/javascript/object.create-the-new-way- to-create-objects-in-javascript.html)? – Siva 2013-03-21 10:16:05

+0

相应地更新了问题。 – Siva 2013-03-21 10:22:14

+0

@ Siva-no,那不是我。 – RobG 2013-03-21 14:16:31

相关问题