为什么Object.create()如此冗长?

时间:2012-02-13 00:38:40

标签: javascript ecmascript-5

Object.create是JavaScript的一个很好的补充,因为它更多地依赖于JS的原型性质。但是,我不禁发现函数的第二个参数的语法过于冗长,退一步。

例如,如果我想创建一个对象,并在派生对象中指定一个新属性,我需要在属性对象中包含该属性值,无论我是否对这些额外功能感兴趣。 / p>

所以,就像这样简单:

 o = Object.create({}, { p: 42 })

现在变为:

 o = Object.create({}, { p: { value: 42 } }) 

显然这是一个简单的例子,但对我来说,冗长是不必要的,应该是可选的。

是否有人理解要求属性对象的决定?您对新语法的要求有何看法?

注意:我知道有一些简单的解决方案可以克服这一要求。

1 个答案:

答案 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));
}

在这里演示:http://jsfiddle.net/jfriend00/vVjRA/

相关问题