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/

10-06 04:04