在我尝试了解有关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.'
问题:
上述示例有多正确? This answer似乎与上面的例子相矛盾。它似乎给出了rawDesc
可能是私有成员的概念,只能通过{{1}的getter / setter修改}。这有用吗?
此外,尝试使用desc
设置desc
的值似乎不起作用。为什么会这样?
Object.defineProperty和Object.create的哪些部分相似?
研究:
有些相关的问题:Why can I set [enumerability and] writability of unconfigurable property descriptors?
我尝试删除car2.desc = 'Merc'
和writable: false
并尝试设置值但无效。
答案 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.create和Object.defineProperty在ECMA-262中相邻,并不难解决。基本上,第一个只是向现有对象添加属性,第二个创建一个新对象并设置其[[Prototype]]
(即它等同于构造函数)。