Javascript Object Inheritence - PullRequest
       16

Javascript Object Inheritence

1 голос
/ 01 февраля 2010

Я создаю элемент управления для карт Google v2. При создании своего элемента управления я столкнулся с проблемой проектирования и хочу найти подходящее решение. Вот этот товар.

Пользовательский элемент управления Google наследуется от GControl;

myControl.prototype = new GControl();

Далее мне нужно перегрузить инициализатор, поэтому вот оно.

 myControl.prototype.initilize = function (map) { 
    //do some work and return stuff

 };

Теперь в моей пользовательской функции initlize элементов управления я создаю пару элементов, которые с помощью класса GEvent подписываются на различные события. Чтобы сделать мои функции обратного вызова управляемыми, я включил их в прототип элементов управления.

myControl.prototype.onEvent = function(e){
  //do some work;
  //modify the members of the current myControl instance
};

В моей функции обратного вызова "onEvent" я хочу изменить членов в моем контроле. Каков наилучший способ получить доступ к моему элементу управления из функции? Ключевое слово "this" не может использоваться, потому что это ссылка на элемент, по которому был выполнен щелчок, в моем случае это div. И я не могу получить доступ к членам через прототип, потому что мне нужен конкретный экземпляр объекта. Единственное жизнеспособное решение, которое я рассмотрел, - это создать свой глобальный элемент управления в одном из моих сценариев. Это лучший метод?

Ответы [ 2 ]

1 голос
/ 01 февраля 2010

Самая простая вещь, которую я могу себе представить, это определить ваш метод onEvent в вашем конструкторе, там у вас будет быстрый доступ к текущему экземпляру объекта, и вам не придется изменять ваш публичный API:

function MyControl () {
  var instance = this; // store a reference to 'this'

  this.onEvent = function (e) {
    // use the instance variable
    instance.otherMethod();
  };
}

Обратите внимание, что в этом подходе свойство onEvent будет физически существовать в экземплярах вашего объекта (obj.hasOwnProperty('onEvent') = true).

Редактировать: Вы можете просто использовать функцию GEvent.bind:

GEvent.bind(map, "click", myObj, myObj.onEvent);

Приведенный выше метод bind будет принудительно устанавливать контекст, поэтому ключевое слово this внутри myObj.onEvent будет указывать на экземпляр объекта myObj при запуске события, оно будет работать с вашим кодом без проблем.

0 голосов
/ 01 февраля 2010

Я не знаком с тем, как вы подписываетесь на события с помощью GEvent, поэтому я сделаю эту часть. Сделайте это:

myControl.prototype.onEvent = function(e, instance) {
  // do some work
  // modify members of 'instance'
};

function wrap(handler, instance) {
  return function(e) {
    handler(e, instance);
  }
}

GEvent.Register('Event', wrap(instance.onEvent, instance));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...