Object.create是JavaScript的一个很好的补充,因为它更多地依赖于JS的原型性质。但是,我不禁发现函数的第二个参数的语法过于冗长,退一步。
例如,如果我想创建一个对象,并在派生对象中指定一个新属性,我需要在属性对象中包含该属性值,无论我是否对这些额外功能感兴趣。 / p>
所以,就像这样简单:
o = Object.create({}, { p: 42 })
现在变为:
o = Object.create({}, { p: { value: 42 } })
显然这是一个简单的例子,但对我来说,冗长是不必要的,应该是可选的。
是否有人理解要求属性对象的决定?您对新语法的要求有何看法?
注意:我知道有一些简单的解决方案可以克服这一要求。
答案 0 :(得分:5)
语法以这种方式完成,以便您可以添加控制每个属性的参数:
所以,当你这样做时:
o = Object.create({}, { p: { value: 42 } })
你说你想要一个名为p
的属性,其值为42
。这里的关键是你可以为每个属性设置其他参数,如果没有这个额外级别的对象层次结构,你将无法通过这些额外的参数。
因此,例如,你也可以这样做:
o2 = Object.create({}, { p: { value: 42, writable: true, enumerable: true, configurable: true } });
这里不仅指定了42
的值,还指定了该属性的一些选项。如果此处没有额外级别的对象层次结构,那么您将无法放置这些额外选项。
是的,当你只想要简单的情况时,它似乎不方便。但是,您可以轻松地为自己编写一个辅助函数,使更简单的语法工作:
function myCreate(proto, props, enumerable, writable, configurable) {
// last three arguments are optional - default them to true if not present
if (typeof enumerable === "undefined") {enumerable = true;}
if (typeof writable === "undefined") {writable = true;}
if (typeof configurable === "undefined") {configurable = true;}
var wrapper = {};
for (var i in props) {
wrapper[i] = {
value: props[i],
enumerable: enumerable,
configurable: configurable,
writable: writable
};
}
return(Object.create(proto, wrapper));
}