Как я могу ссылаться на метод объекта в JavaScript из-за пределов объекта (через событие)? - PullRequest
0 голосов
/ 12 июля 2011

Я создаю довольно сложный объект и хочу иметь возможность манипулировать объектом извне. Я хочу сослаться на привилегированный метод из события щелчка

function myObject(){
   //How do I reference this function?
   this.doSomething = function (action){
        var doing = action;
   }

}

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

var obj = new myObject();
obj.doSomething('hit keyboard');

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

т.е.

<a href="#" onclick="doSomething()">Do Something</a>

не работает, потому что метод doSomething, конечно, является частью объекта, а не глобальной функцией. Я мог бы переписать код, чтобы сделать его глобальным, но я бы предпочел этого не делать.

Если этот вопрос не имеет смысла, я был бы рад прояснить его. Заранее спасибо.

Ответы [ 5 ]

1 голос
/ 12 июля 2011

Хотя он будет находиться в глобальной области видимости и, как правило, не рекомендуется, вы можете сделать это (если вам просто нужно, чтобы он работал):

function myObject(){
   //How do I reference this function?
   window.doSomething = function (action){ // USE window instead of this !!
        var doing = action;
   }

}

Используя window вместо this, он может быть вызван в вашем обработчике.

0 голосов
/ 12 июля 2011

Чтобы определить проблему, вы находитесь в обработчике кликов определенного объекта и хотите вызвать метод для другого объекта в вашем коде, к которому вы не можете получить доступ непосредственно из объекта, в котором вы находитесь.эти параметры, и вы можете просто выбрать тот, который кажется лучшим или наименее нежелательным:

  1. Вы можете сделать объект, для которого вы хотите вызвать метод, в глобальной области действия.
  2. Вы можете сделать объект, для которого вы хотите вызвать метод, доступным для поиска в глобальной области видимости (либо в родительской иерархии, либо с помощью некоторого вида глобального поиска).Это можно сделать таким образом, не добавляя больше объектов верхнего уровня в глобальную область видимости.
  3. Вы можете установить объект, который вы хотите вызвать методом, в качестве данных экземпляра для всех объектов, которые будут иметь обработчик щелчка, такчто вы можете просто ссылаться на глобальный объект из данных экземпляра объекта обработчика щелчка.
  4. Вы можете объявить обработчик щелчка, чтобы иметь параметр, содержащий ваш объект, используя замыкания функций и избегая всех глобальных данных.
0 голосов
/ 12 июля 2011

Проблема состоит в том, что существует разрыв между экземпляром объекта и элементом на странице, событие которого должно вызвать функцию объекта.Существуют различные способы справиться с этим, не подвергая себя опасности.Например, одним из способов было бы связать их через свойство объекта:

Присвоить элементу идентификатор:

<a id="myLink">Do Something</a>

Добавить свойство элемента в объект:

function myObject(element){
   this.element = element;

   if (this.element) {
      this.element.onclick = this.doSomething;
   }

   this.doSomething = function () {
         // do stuffs.
   }
}

Создание объекта:

var obj = new myObject(document.getElementById('myLink'));

Или еще немного упростить определение объекта:

function myObject(element){
   this.element = element;

   if (this.element) {
      this.element.onclick = function () {
         // do stuffs.
      }
   }
}
0 голосов
/ 12 июля 2011

Вам нужно, чтобы объект находился в глобальной области видимости.Попробуйте это:

window.myObject = {
    doSomething: function(action) {
        alert("Done!");
    }
};

, а затем вы создадите событие щелчка, например

<a href="#" onclick="myObject.doSomething()">Do Something</a>

Пример

0 голосов
/ 12 июля 2011

Если экземпляр объекта уже создан, вы можете сказать:

<a href="#" onclick="obj.doSomething()">Do Something</a>

В противном случае,

<a href="#" onclick="function () { return new myObject().doSomething(); }">Do Something</a>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...