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 непосредственно.)

http://jsfiddle.net/W4CSE/2/

Идея состоит в том, чтобы обернуть код в замыкание, таким образом скрывая 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

Другие вопросы по тегам