2013-05-23 5 views
1

Каков предпочтительный способ определения атрибутов свойств в ECMAScript 5? Из того, что я понимаю, есть по крайней мере два способа:Как настроить свойства в ECMAScript 5: Object.create или Object.defineProperties?

function Foo() { 
    Object.defineProperties(this, { 
    'a': { 
     value: "A", 
     writable: false 
    }, 
    'b': { 
     value: "B", 
     writable: true, 
     enumerable: true 
    } 
    }); 
} 

var f = new Foo(); 

Или:

var Foo = Object.create({}, { 
    'a': { 
     value: "A", 
     writable: false 
    }, 
    'b': { 
     value: "B", 
     writable: true, 
     enumerable: true 
    } 
    }); 
}; 

var f = Object.create(Foo); 

Помимо достоинств инстанцировании с new против Object.create, есть падение производительности при определении свойств с использованием Object.defineProperties() как в первом примере? Являются ли эти два эквивалента? Существует ли консенсус в отношении удобочитаемости?

+1

Там никогда не консенсус. –

+0

Что касается производительности, это зависит от реализации и версии. Попробуй это. –

+2

Пример вашего конструктора помещает свойства в 'f', тогда как в вашем примере' Object.create' 'f' наследует свойства. –

ответ

2

есть хит производительности в определении свойств с помощью Object.defineProperties()

Да. Дескрипторы свойств не оптимизируются как нормальные свойства и, следовательно, намного медленнее. Если вам (придется) использовать их, вы все равно не заботитесь о производительности. Сравнение Object.create с new довольно бессмысленно из-за их различного поведения и незначительности их расхождений в производительности.

Существуют два эквивалента?

Номер

// The first one, 
function Foo() { 
    Object.defineProperties(this, propertydescriptors); 
} 
f = new Foo; 
// is equivalent to 
function Foo() {} 
f = Object.defineProperties(new Foo, propertydescriptors); 
// as long as there is closure in the property descriptor 

// The second one, 
foo = Object.create({}, propertydescriptors); 
// is equivalent to 
foo = Object.defineProperties(Object.create({}), propertydescriptors); 

и new Foo не то же самое, как Object.create({}) - нет общих Foo.prototype. Кроме того, в вашем втором примере вы даже

f = Object.create(foo); 

который теперь, безусловно, отличается от f = new Foo сверху.

Есть ли консенсус относительно читаемости?

Дескрипторы свойств в конструкторе довольно необычны. Если вам нужны только они, нет причин не использовать более короткий и более сжатый синтаксис Object.create. Тем не менее, вы должны использовать только Object.create, если вы действительно хотите, чтобы наследовать от чего-то, что не является пустой объект:

f = Object.create(fooproto, propertydescriptors); 

Если нет, то просто использовать

f = Object.defineProperties({}, propertydescriptors); 
Смежные вопросы