Определить установщик для хеша в JavaScript - PullRequest
0 голосов
/ 31 октября 2010

Я определил хеш следующим образом:

var props = {
    id: null,
    title: null,
    status: null
};

Я бы хотел определить установщик для поля состояния (и только для него), выполнив его следующим образом:

props.__defineSetter__("status", function(val){
    //Checking correctness of val...
    status = val;
});

Ноэто не работает :( Итак, как правильно это сделать?

Ответы [ 3 ]

2 голосов
/ 31 октября 2010

Простой, вам нужно использовать

this.status = val;

В противном случае вы просто устанавливаете несвязанную глобальную переменную status, равную val.

И, как уже отмечалось, сеттеры / геттеры не реализованы в IE.

Кроме того, я не уверен, насколько разумно иметь сеттер, имя которого совпадает с именем свойства, которое он устанавливает. Не уверен, приведет ли это к конфликту, но это кажется плохой идеей, да? В идеале переменная, которая будет установлена, должна быть скрыта в закрытии

var props = {
  id: null,
  title: null
};

(function() {

  var status;
  props.__defineSetter__("status", function(val){
    //Checking correctness of val...
    status = val;
  });

  props.__defineGetter__('status', function() { return status; });

}());

Таким образом, status полностью защищен от прямого доступа, который является точкой использования сеттеров и геттеров.

2 голосов
/ 31 октября 2010

Первое, на что указал MooGoo. Но вы также не можете назначить установщик свойств объекту с тем же именем, что и существующая переменная в объекте.

Итак, ваш код должен быть примерно таким:

var props = {
    id: null,
    title: null,
    hStatus: null,
};

props.__defineSetter__("status", function(v){
    this.hStatus = v;
});

props.__defineGetter__("status", function(){
    return this.hStatus;
});

[править] Да, MooGoo отредактировал свой ответ быстрее, чем время, которое я потратил на написание этой 8 (.

0 голосов
/ 31 октября 2010

Это должно работать:

props.__setStatus__ = function(val) {
    // Check correctness of val
    this.status = val;
}

Использование:

props.__setStatus__('Alive');
...