Как избавиться от прототипа в JS? - PullRequest
4 голосов
/ 01 мая 2011

У меня острая проблема, и хотя ответ может быть очевидным, я не могу понять, как сделать то, что я пытаюсь сделать.

Я создал библиотеку сценариев для своего приложения, использующего JSпрототипы и шаблоны для динамического создания элементов DOM и связывания этих элементов с обработчиками.Пример:

var ppane = new AWP.iuiPanel(theObject, { title: 'Select filter(s)', idDisplay: 'block', idString: params.sender._options['title'] });

AWP.iuiPanel - это класс, определенный как прототип функции, например:

AWP.iuiPanel = function() { <i'm a constructor> }
AWP.iuiPanel.prototype = { <a bunch of methods here> }

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

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

* 1012у меня проблема, когда я хочу избавиться от этой конструкции.Я могу легко избавиться от элемента DOM.Но тогда у меня все еще есть экземпляр класса в памяти с методами, связанными с событиями браузера, ища элемент DOM, который был удален.Мне нужно иметь возможность распоряжаться не только элементом DOM, но и экземпляром класса, и я не могу понять, как это сделать.

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

Для справочной информации, вот пример класса, как я его определяю:

Это обязательно псевдокод (ish) ...

AWP.trivialExample = function(someDomRef, someOptionSet) {
   this._id = someOptionSet['name'];
   this._width = someOptionSet['width'];
   this._width = someOptionSet['height'];
   this._domRef = someDomRef;
   this._object = '';

   this.constructDOM();
   this.wireEvents();

}

AWP.trivialExample.prototype = {

   constructDOM: function() {
      // build a complex DOM element relative to a provided DOM ref using the
      // desired and height.  This uses a template and I won't give a precise example
      // of such a template.
      jQuery("#aTemplate").tmpl(someJSONData).appendTo("body");

   },

   positionRelative: function() {
      // this function would get the location of a specific DOM ref and always maintain
      // a relative position for the DOM element we just constructed

   },

   wireEvents: function() {
      // hook up to events using JQuery (example)
      jjQuery(window).resize(this.positionRelative);

   }

}

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

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

Вся помощь оценена.

Спасибо;

Ответы [ 2 ]

1 голос
/ 01 мая 2011

Предложение для прослушивателей событий, ссылающихся на удаленный узел DOM:

точно так же, как у вас есть «wireEvents», у вас должно быть соответствующее «unwireEvents» на случай, если вы решите прекратить использование объекта. В этом случае addEventListener () необходимо использовать вместе с removeEventListener (). Вы должны изменить свой прототип, чтобы удалить прослушиватели событий, когда соответствующий узел DOM «расположен», как вы говорите.

0 голосов
/ 01 мая 2011
 AWP.iuiPanel.prototype = null; // ?
...