как использовать оператор get для переменной после создания объекта? - PullRequest
2 голосов
/ 02 февраля 2011

Я недавно задал вопрос здесь , где я нашел, что могу использовать {get a () {return 'whatev'}} для управления тем, что происходит, когда переменные получают и устанавливают.

Я хочу знать, если / как я могу сделать это после создания переменной, что-то вроде этого, за исключением того, что это не работает:

abc=new Object();
abc._a = NaN;
abc.get a() {
return abc._a;
}
abc.set a(i) {
abc._a=i;
}

В другом вопросе он показал мне только, как это сделатьпри создании нового объекта:

abc = {
  _a:NaN;
  get a() {
    return _a;    
    }
  set a(i) {
    _a=i;
    }
  }

РЕДАКТИРОВАТЬ: Я нашел ' defineGetter ' и ' defineSetter ' на https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Object/defineGetter, это работает, но говорит, что это нестандартно.Есть ли более стандартный способ?

Ответы [ 3 ]

2 голосов
/ 02 февраля 2011

get и set являются частью инициализатора объекта.Они не являются свойствами объекта и поэтому не могут быть добавлены позже.

Подробнее см. ECMAScript 1.5, Раздел 11.1.5 Инициализатор объекта .

1 голос
/ 02 февраля 2011

Нестандартные __defineGetter__ и __defineSetter__ поддерживаются в большинстве браузеров (Mozilla, WebKit и Opera, но не в IE).Они будут делать то, что вы хотите, и являются наиболее поддерживаемым вариантом (если не считать замены вашего свойства явными getX() и setX() методами).Пример:

var o = {};
o._a = "foo";

o.__defineGetter__("a", function() {
    return this._a;
});

o.__defineSetter__("a", function(val) {
    return this._a = val;
});

alert(o.a);  // "foo"
o.a = "bar";
alert(o._a); // "bar

Обновление :

Обратите внимание, правильный способ сделать это сейчас - использовать Object.defineProperty или Object.defineProperties.

1 голос
/ 02 февраля 2011

Только ES5 (ECMAScript Edition 5) будет поддерживать геттеры и сеттеры. К сожалению, ES5 еще не полностью реализован ни одним браузером, только частично.

Текущие реализации Javascript не поддерживают геттеры и сеттеры, ни стандартным, ни кросс-браузерным способом. Извините, вам придется написать явные функции getA и setA.

Вот рекомендуемый способ в ES3 (который работает во всех современных браузерах, даже в IE6) с использованием замыканий:

var abc = (function () {
  var a = NaN;
  return {
    getA: function () {
        return a;
    },
    setA: function (value) {
        a = value;
    }
  };
})();

Это даст вам объект в переменной abc с двумя функциями: getA() и setA(value). Единственный способ добраться до a - это эти два метода.

abc.getA()
// NaN

abc.setA(25);
abc.getA();
// 25

Сама переменная a скрыта от внешнего мира, поскольку она присутствует только в рамках анонимной функции, используемой для создания объекта.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...