Accessor Descriptor: Как использовать «get» и «set» на практике? - PullRequest
3 голосов
/ 03 января 2012

Я не уверен, правильно ли я понимаю.

Этот пример взят из 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 ]

6 голосов
/ 03 января 2012

Вы, похоже, ищете закрытие .Это шаблон кодирования, который позволяет вам использовать закрытые переменные и предоставлять только то, что вы хотите выставить (публичные переменные).

(function() {
    var bValue;

    Object.defineProperty(o, "b", {get : function(){ return bValue; },  
                                   set : function(newValue){ bValue = newValue; },  
                                   enumerable : true,  
                                   configurable : true}); 
})();

Он создает функцию и выполняет ее немедленно.Это кажется бесполезным, но поскольку функции вводят уровень scoping , bValue не доступен нигде, кроме как внутри функции, таким образом.

Свойство o.b действует как делегат междуразработчик и ценность.Вы не можете получить доступ к bValue сам.(Хотя в этом примере геттер / установщик явно действуют так, что они точно делают то же самое, что и bValue напрямую.)

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

3 голосов
/ 03 января 2012

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

...