Согласно документации для Object.defineProperty()
на MSDN
Дескрипторы свойств, присутствующие в объектах, бывают двух основных типов: данные
дескрипторы и дескрипторы доступа. Дескриптор данных является свойством
это имеет значение, которое может или не может быть доступно для записи. Аксессор
дескриптор - это свойство, описываемое парой геттер-сеттер
функции. Дескриптор должен быть одним из этих двух вариантов; не может быть
и.
И дескрипторы данных, и методы доступа являются объектами. Они разделяют
следующие дополнительные клавиши:
настраивается true тогда и только тогда, когда тип этого дескриптора свойства может быть изменен, и если свойство может быть удалено из соответствующего объекта. По умолчанию false.
enumerable true тогда и только тогда, когда это свойство отображается при перечислении свойств соответствующего объекта. По умолчанию false.
Дескриптор данных также имеет следующие дополнительные ключи:
значение Значение, связанное со свойством. Может быть любым допустимым значением JavaScript (число, объект, функция и т. Д.). По умолчанию не определено.
доступный для записи true тогда и только тогда, когда значение, связанное со свойством, может быть изменено с помощью оператора присваивания. По умолчанию false.
Дескриптор средства доступа также имеет следующие дополнительные ключи:
get Функция, которая служит для получения свойства свойства, или неопределенная, если нет получения. Когда к свойству обращаются, эта функция вызывается без аргументов и с этим набором объекта, через который осуществляется доступ к свойству (это может быть не тот объект, для которого свойство определяется из-за наследования). Возвращаемое значение будет использоваться в качестве значения свойства. По умолчанию не определено.
set Функция, которая служит установщиком для свойства, или неопределенная, если установщика нет. Когда свойство присваивается, эта функция вызывается с одним аргументом (значение присваивается свойству) и с этим набором объекта, через который присваивается свойство. По умолчанию не определено.
Если дескриптор не имеет значения, доступен для записи, получить и установить
ключи, он рассматривается как дескриптор данных. Если дескриптор имеет оба
Значение или запись и получить или установить ключи, исключение.
Это означает, что get
и set
перехватывают вызовы доступа и вызовы назначения соответственно.
Очень хороший пример (и описание) здесь указывает на яркий пример того, когда это полезно.
Возьмите случай, когда у вас есть имя и фамилия на лице с общей потребностью в полном имени.
person.setLastName('Smith');
person.setFirstName('Jimmy');
person.getFullName(); // Jimmy Smith
Использование клавиш get
и set
дает возможность объявить объект следующим образом:
var person = {
firstName: 'Jimmy',
lastName: 'Smith',
get fullName() {
return this.firstName + ' ' + this.lastName;
},
set fullName (name) {
var words = name.toString().split(' ');
this.firstName = words[0] || '';
this.lastName = words[1] || '';
}
}
и присвоение ему, и доступ к нему следующим образом:
person.fullName = 'Jack Franklin';
console.log(person.firstName); // Jack
console.log(person.lastName) // Franklin
console.log(person.fullName) // Jack Franklin
Это позволяет разработчику взаимодействовать с полным именем, не оставляя случайно имя или фамилию неназначенной или неправильно назначенной.
Наконец,
Директива use strict
будет обеспечивать попытки чтения и записи для атрибутов, определенных с помощью get
или set
соответственно. См. W3Schools .
"use strict";
var obj = {get x() {return 0} };
obj.x = 3.14; // This will cause an error