«Вложенные» геттеры и сеттеры в JavaScript - PullRequest
0 голосов
/ 03 ноября 2011

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

globe.camera.position = Position.create();

Это эквивалентно следующему выражению:

globe.getCamera().setPosition(Position.create());

У меня нет проблем с созданием «первого уровня» геттеров / сеттеров, часть .camera, например:

function Camera() {

    var x,y,z;

this.__defineGetter__("camera", function() {
        alert("This is the camera getter");
});

    this.__defineSetter__("camera", function(position) {            
        alert("This is the camera setter");
});

}

...

globe=new Camera();
globe.camera=...
c=globe.camera;

...

Но я не совсем уверен, как определить геттер положения внутри камеры. Я пытаюсь что-то вроде этого, но это не сработает:

function Position() {

    this.__defineGetter__("position", function() {
        alert("This is the position getter");
});

}

globe.camera=new Position();
pos=globe.camera.position;

Предупреждение внутри геттера не появится. Есть какие-нибудь подсказки по этому поводу? Возможно ли вообще добиться такого поведения? Я много искал в Google, но не смог найти правильные условия поиска, и примеры для получателей / установщиков, как правило, очень просты. Заранее спасибо.

1 Ответ

3 голосов
/ 03 ноября 2011

__defineGetter__ и друзья не являются стандартными.

var Camera = Object.create({}, {
  position: {
    get: function () {
      return Position.create();
    },
    set: function (p) {
      this._position = p;
    }
  }
});

Object.defineProperty(globe, "camera", {
  get: function () {
    return Object.create(Camera);
  }
});

Вы хотите использовать Object.defineProperty

Однако, почему вы используете добытчики исеттеры?Они злые.Вы должны избегать их действительно, если вы не делаете что-то умное.

...