Ste*_*eve 2 javascript ecmascript-5
Object.create是JavaScript的一个很好的补充,因为它更多地依赖于JS的原型性质.但是,我不禁发现函数的第二个参数的语法过于冗长,退一步.
例如,如果我想创建一个对象,并在派生对象中指定一个新属性,我需要在属性对象中包含该属性值,无论我是否对额外功能感兴趣.
所以,这很简单:
o = Object.create({}, { p: 42 })
Run Code Online (Sandbox Code Playgroud)
现在变成:
o = Object.create({}, { p: { value: 42 } })
Run Code Online (Sandbox Code Playgroud)
显然这是一个简单的例子,但对我来说,冗长是不必要的,应该是可选的.
有没有人理解要求属性对象的决定?您对新语法的要求有何看法?
注意:我知道有一些简单的解决方案可以克服这个要求.
语法以这种方式完成,以便您可以添加控制每个属性的参数:
所以,当你这样做时:
o = Object.create({}, { p: { value: 42 } })
Run Code Online (Sandbox Code Playgroud)
你说你想要一个名为pvalue的属性42.这里的关键是你可以为每个属性设置其他参数,如果没有这个额外级别的对象层次结构,你将无法通过这些额外的参数.
所以,例如,你也可以这样做:
o2 = Object.create({}, { p: { value: 42, writable: true, enumerable: true, configurable: true } });
Run Code Online (Sandbox Code Playgroud)
这里不仅指定了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));
}
Run Code Online (Sandbox Code Playgroud)
演示:http://jsfiddle.net/jfriend00/vVjRA/