Accessor Descriptor: Как использовать "get" и "set" на практике?
Я не уверен, правильно ли я понимаю.
Этот пример прямо из MDN (Mozilla Developer Network):
var bValue;
Object.defineProperty(o, "b", {get : function(){ return bValue; },
set : function(newValue){ bValue = newValue; },
enumerable : true,
configurable : true});
Что происходит, так это - он создает глобальную переменную с именем bValue, что еще не сделано. Я понимаю, что этот пример только демонстрирует использование, и, таким образом, все в порядке, если он создает глобальную переменную. Но если я собираюсь использовать это в приложении, я немного изменю его, добавив this
ключевое слово:
Object.defineProperty(o, "b", {get : function(){ return this.bValue; },
set : function(newValue){ this.bValue = newValue; },
enumerable : true,
configurable : true});
Теперь объект o
будет иметь собственность b
и в то же время он также будет иметь другое свойство bValue
, Пользователь (программист) будет иметь доступ только к "b", а не к "bValue", хотя он все еще может напрямую обращаться к bValue - я не понимаю, как это можно предотвратить.
Я понимаю что собственность b
и собственность bValue
не всегда может быть одинаковым, но b
будет зависеть от стоимости bValue
потому что геттер и сеттер позволяют нам предварительно обработать bValue, прежде чем присваивать значение b
,
Главный вопрос в том, правильно ли я понимаю? Или я что-то здесь упускаю?
2 ответа
Вы, кажется, ищете закрытие. Это шаблон кодирования, который позволяет вам использовать закрытые переменные и предоставлять только то, что вы хотите представить (открытые переменные).
(function() {
var bValue;
Object.defineProperty(o, "b", {get : function(){ return bValue; },
set : function(newValue){ bValue = newValue; },
enumerable : true,
configurable : true});
})();
Он создает функцию и выполняет ее немедленно. Это кажется бесполезным, но поскольку функции вводят определенный уровень видимости, bValue
не доступен нигде, кроме как внутри функции.
o.b
Свойство действует как делегат между разработчиком и значением. Вы не можете получить доступ bValue
сам. (Хотя в этом примере получатель / установщик явно действуют так, что они точно так же, как и при использовании bValue
непосредственно.)
Идея состоит в том, чтобы обернуть код в замыкание, таким образом скрывая bValue
из мира, вот так:
var o =(function() {
var o={},bValue;
Object.defineProperty(o, "b", {get : function(){ return bValue; },
set : function(newValue){ bValue = newValue; },
enumerable : true,
configurable : true});
return o;
})();
теперь вы можете ссылаться o.b
но нет bValue