Object.create是JavaScript的重要补充,因为它更加符合JS的原型性质。但是,我不禁发现该函数的第二个参数的语法过于冗长,然后退后一步。
例如,如果我想创建一个对象,并在派生对象中指定一个新属性,则无论我是否对其他功能感兴趣,都需要将该属性值包含在属性对象中。
所以,像这样简单:
o = Object.create({}, { p: 42 })
现在变成:
o = Object.create({}, { p: { value: 42 } })
显然,这是一个简单的示例,但是对我来说,冗长是不必要的,应该是可选的。
有谁了解需要属性对象的决定?您对新语法的要求有何看法?
注意:我知道有简单的解决方案可以克服此要求。
最佳答案
语法是通过这种方式完成的,因此您可以添加控制每个属性的参数:
因此,当您这样做时:
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));
}
此处演示:http://jsfiddle.net/jfriend00/vVjRA/