При добавлении нескольких объектов к объекту добавление их с помощью Object.defineProperties()
обычно создает более чистый и читаемый код, чем добавление их по одному или в группы.Самостоятельные ссылки в Object.defineProperties()
Однако, если свойство ссылается на другое, Object.defineProperties()
не может его обработать. Рассмотрим фиктивный пример:
var foo = {};
Object.defineProperties(foo, {
"one" : {value: 1, enumerable: true},
"two" : {value: foo.one + 1, enumerable: true}
})
console.log(foo); // { one: 1, two: NaN }
var bar = {};
Object.defineProperties(bar,{
"one" : {value: 1, enumerable: true}
});
Object.defineProperties(bar,{
"two" : {value: bar.one + 1, enumerable: true}
});
console.log(bar); // { one: 1, two: 2 }
Теперь, как ясно, что второе решение всегда работает. Тем не менее, можно было бы предположить, что первый мог работать также, как он кажется как сокращение для другого и предлагает последовательную обработку свойств в любом случае.
Я не нашел достоверной документации по этому вопросу.
Так вопросы:
- Это намеренное ограничение или техническая сложность в фоновом режиме?
- Задокументировано?
- Является ли это конкретным поведением или стандартным поведением?
Редактировать: ответьте ясно, и посмотрите мои комментарии там. Это простая буквальная проблема (не проблема, скорее :), не связанная напрямую с Object.defineProperties().
Цель. Вам понадобятся два отдельных вызова '.defineProperties'. 'one' не определен до того, как весь метод был выполнен. – Teemu
См. Также [Самостоятельные ссылки в декларациях литералов объектов] (http://stackoverflow.com/q/4616202/1048572). Не существует 'foo.one' перед вызовом' Object.defineProperties'. – Bergi