Почему Object.create() такой подробный?

Object.create — отличное дополнение к JavaScript, поскольку оно соответствует больше к прототипической природе JS. Однако я не могу не найти синтаксис второго параметра функции слишком многословным и шагом назад.

Например, если я хочу создать объект и указать новое свойство в производном объекте, мне нужно включить это значение свойства в объект свойства, независимо от того, интересны ли мне дополнительные функции или нет.

Итак, что-то простое, как это:

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

Теперь становится:

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

Очевидно, это простой пример, но мне многословие не нужно и должно быть необязательным.

Кто-нибудь понимает решение потребовать объект свойств? Каково ваше мнение о требованиях нового синтаксиса?

Примечание. Я понимаю, что есть простые решения для преодоления этого требования.


person Steve    schedule 13.02.2012    source источник


Ответы (1)


Синтаксис сделан таким образом, чтобы вы могли добавлять параметры, управляющие каждым свойством:

Итак, когда вы делаете это:

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/

person jfriend00    schedule 13.02.2012