在尝试了解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.'
问:
如何正确的是上面的例子?
This answer似乎与上述示例相矛盾。它似乎给了rawDesc
可能是一个私人成员,只能通过desc
的getter/setter修改的概念。这有用吗?此外,尝试使用
car2.desc = 'Merc'
设置desc
的值似乎不起作用。为什么?Object.defineProperty和Object.create的哪些部分是相似的?
研究:
有点相关的问题:Why can I set [enumerability and] writability of unconfigurable property descriptors? 我试图消除writable: false
和value: 'Porsche boxter'
,并试图设定值,但无济于事。
谢谢,它确实是一个复制粘贴的例子,正如问题中提到的。至于与矛盾的例子,我想我误解了'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
相应地更新了问题。 – Siva 2013-03-21 10:22:14
@ Siva-no,那不是我。 – RobG 2013-03-21 14:16:31