Автор оригинала: Maximiliano Benedetto.
Геттерс и загадки очень важны на задневших языках, но они никогда не могли набрать много популярности в JavaScript. На самом деле, это не легкая задача найти документацию о хорошем способе справиться с ними.
В JavaScript значение в основном является значением, которое вы можете получить доступ к чтению или записи свободно. Но с ростом крупных приложений AJAX и все больше и больше логики собирается на стороне клиента, становится все более распространенным, чтобы иметь свойства, которые мы хотим защитить от прямого доступа или даже подтвердить, прежде чем присматривать нашим объектам.
Для этого у нас есть GetValue
/ SetValue
узор, который работает так же, как разработчик Java, ожидает:
function Field(val){ var value = val; this.getValue = function(){ return value; }; this.setValue = function(val){ value = val; }; }
Но это довольно многословный и уродливый. Это где ecmascript 5 приходит в:
var person = { 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 = 'Bryan Singer'; alert(person.firstName); // alerts Bryan alert(person.lastName) // alerts Singer
Используя этот синтаксис, вы можете позже назначить или получить значение, как и любое другое свойство, используя разные функции для каждой операции.
Если вам нужно, вы также можете определить своих посетителей и Getter после Определение объекта с использованием Объект.defineproperty
Отказ
var Child = {}; Object.defineProperty(Child, 'old', { get: function() { return this.age }, set: function(value) { this.age = value - 2 } }) Child.old = 7; console.log(Child.old); // 5
Просто убедитесь, что никогда не смешивайте Get/Set с любым другим именем свойства. Что я имею в виду под этим, в последнем примере у вас не может быть другого Это .old
имущество. Например, если наш сеттер выглядит так:
set: function(value) { this.old = value }
Мы бы в конечном итоге имеем максимальную ошибку стека вызовов, потому что сеттер будет бесконечно призывать себя …
Соседниты и получатели могут быть использованы для расширения прототипов, а также для проверки некоторых данных. Имейте в виду, что Object.DefineProperties
Позволяет установить более одного свойства за раз:
var Person = function() {}; Object.defineProperties(Person.prototype, { 'fullName': { get: function() { return this.firstname + ' ' + this.lastName }, set: function(value) { var parts = value.split(' '); if (parts.length == 2) { this.firstName = parts[0]; this.lastName = parts[1]; } } } }); var p = new Person(); p.fullName = "Maxi Benedetto"; alert(p.firstName); // Maxi alert(p.lastName); // Benedetto
Этот синтаксис GET/SET поддерживается во всех основных браузерах, кроме IE <9, а также в Node.js.
Есть старый синтаксис, __definegetter__
и __definesetter__
, но он устарел, поэтому вы больше не должны обращать на него внимания.
Дайте мне знать, что вы думаете, оставив комментарий ниже!
Ваше здоровье!