Разница между использованием сеттеров или методов в JavaScript - PullRequest
0 голосов
/ 11 ноября 2018

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

первый способ, без сеттеров.

>obj1 = {
    arr: [];
 }
>obj1.arr.push('first')
>obj1.arr
[ 'first' ]

Второй способ, с сеттерами.

>obj2 = {
    set add(data) {
        this.arr.push(data);
    },
    arr: []
 }
>obj2.add = 'first'
>obj2.arr
[ 'first' ] 

Ответы [ 4 ]

0 голосов
/ 11 ноября 2018

Свойство getter / setter отличается от «обычного» свойства экземпляра, одно называется «свойство именованных данных», другое - «свойство именованного доступа».

Пожалуйста, позвольте встретить цитату ниже часть документов из ECMAScript 5.1.

https://www.ecma -international.org / ECMA-262 / 5,1 / # втор-8.10.1

Объект - это набор свойств. Каждое свойство является либо свойство именованных данных, свойство именованного метода доступа или внутренний Свойство:

Именованное свойство данных связывает имя с языком ECMAScript значение и набор логических атрибутов.

Именованное свойство средства доступа связывает имя с одним или двумя средствами доступа. функции и набор булевых атрибутов. Функции доступа используется для хранения или извлечения значения языка ECMAScript, которое связанные с собственностью.

Внутреннее свойство не имеет имени и не доступно напрямую через Операторы языка ECMAScript. Внутренние свойства существуют исключительно для цели спецификации.

Существует два вида доступа к именованным (не внутренним) свойствам: get и положить, соответствующие поиску и присвоению, соответственно.

И

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

0 голосов
/ 11 ноября 2018

Я думаю, что разница только в том, «как это выглядит». Использование сеттеров - это самый близкий способ понять людей, пришедших на js из объектно-ориентированных языков.

0 голосов
/ 11 ноября 2018

Синтаксис установщика в вашем примере на самом деле не мешает клиентскому коду по-прежнему добавлять значение, используя прямой вызов push, как в первом блоке кода. Так что разница в том, что вы просто добавили еще один способ сделать то же самое.

Чтобы провести справедливое сравнение, вы должны определить один и тот же метод в обеих альтернативах: один раз как обычный метод и один раз как метод установки, а затем разница заключается только в синтаксисе аргумента передается методу с помощью obj.add('first') или obj.add = 'first'.

В этом конкретном случае я бы проголосовал против установщика, потому что создается ложное впечатление, что если вы «назначите» другое значение, первое присвоенное значение будет перезаписано :

obj.add = 'first';
obj.add = 'second';

... но, очевидно, это не так: оба значения существуют в объекте сейчас.

0 голосов
/ 11 ноября 2018

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

Таким образом, в основном, использование setter только для добавления дополнительного инкапсулированного поведения к функциям объектов.

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

Надеюсь, это поможет вам.

...