В чем преимущество функции атрибутов свойств в ECMAScript-5?

Я хочу узнать больше об использовании описанных здесь атрибутов свойств: http://www.ecma-international.org/ecma-262/5.1/#sec-8.6.1

Я могу представить варианты использования этих атрибутов, но они очень редки. Кроме того, для свойств, доступных для записи, перечисления и настройки, по умолчанию установлено значение false, но в основном я хочу, чтобы эти значения были true, поэтому я должен их установить. Почему они ложны по умолчанию?

Сделать объект и установить его атрибуты было очень просто для меня. Теперь есть дескриптор свойства, который я мог бы описать как искусственный, неестественный, сложный или неудобный. Может быть, я просто пропустил что-то очень важное.

Итак, мои вопросы: Какова основная цель атрибутов свойства. Как мы можем их использовать?

Можно ли избежать использования дескриптора свойства? Например, с каким-то хорошим шаблоном, который установит для меня атрибуты? Например, если я использую Object.create со вторым параметром «Свойства», это заставляет меня использовать дескриптор свойства. Так должен ли я избегать использования этого?


person Entity Black    schedule 29.04.2013    source источник
comment
Могу ли я избежать дескрипторов свойств? Разумеется, ничто не заставляет вас их использовать. Просто выполните классическое присвоение собственности.   -  person Bergi    schedule 29.04.2013
comment
Я не знаю, почему они сделали значение по умолчанию false, но я предполагаю, что это потому, что уже есть способ создавать свойства со значением по умолчанию true. Что вас на самом деле беспокоит? Если вам нужно какое-то пользовательское поведение по умолчанию, просто создайте функцию, которая устанавливает значения по умолчанию, как вы хотите.   -  person    schedule 29.04.2013


Ответы (2)


"...в основном я хочу, чтобы эти значения были истинными, поэтому я должен их установить."

Только если у вас есть в них потребность. Если вы этого не сделаете, просто используйте типичный синтаксис литерала объекта или оператор присваивания для новых свойств.

"Почему по умолчанию они ложны?"

Я бы предположил, что это потому, что уже есть доступный синтаксис, который по умолчанию использует их как true.

"Создать объект и установить его атрибуты было очень просто для меня. Теперь есть дескриптор свойства..."

Ничего не изменилось. Это так же просто, как и раньше. В вашем распоряжении просто больше инструментов, если они вам нужны.

"...которые я бы назвал искусственными, неестественными, сложными или неудобными".

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

Кроме того, вероятно, в синтаксис литерала объекта в ECMAScript 6 добавлено определение дескриптора свойства.

"Итак, мои вопросы: каково основное назначение атрибутов свойств. Как мы можем их использовать?"

Это должно быть понятно. Они предназначены для ручной настройки параметров configurable, writeable и enumerable свойств объекта. Если вы когда-нибудь столкнетесь с ситуацией, когда вам понадобится один из этих параметров, вы воспользуетесь им.

"Можно ли избежать использования дескриптора свойства?"

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

"Например, с каким-нибудь хорошим шаблоном, который установит для меня атрибуты?"

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

function addWriteable(obj, prop, value) {
    return Object.defineProperty(obj, prop, {
        writeable: true
    });
}
person Community    schedule 29.04.2013

По умолчанию для записи доступно false, только если

Если значение атрибута явно не указано в этой спецификации для именованного свойства

Например, для свойств, которые вы определяете вручную, это будет true. Вы должны знать, что существует огромная разница между самим ecmascript без какой-либо спецификации поверх него и диалектами javascript/jscript.

В любом случае, вы никогда не должны ничего делать с этими свойствами атрибутов, за исключением случаев, когда вы планируете создать фреймворк или что-то в этом роде. Например, Prototype.js мог использовать его для установки Enumerable в false, и я сам использовал его, чтобы переопределить Get, чтобы позволить немного экзотический синтаксис, который было проще использовать разработчикам (похожий на другой собственный синтаксис), но при выполнении обычные вещи, которые вам не нужны.

person David Mulder    schedule 29.04.2013
comment
Object.create с двумя параметрами вызывает defineProperties, что заставляет меня использовать дескриптор свойства. Значит ли ваш ответ, что мне следует избегать использования объявления параметров свойств в этой функции? Потому что в противном случае я думаю, что должен понимать то, что я устанавливаю. - person Entity Black; 29.04.2013
comment
Действительно, не устанавливайте ничего, если вам это не нужно. - person David Mulder; 29.04.2013