Модераторы: Sardar, Aliance
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Имопорт функций 
:(
    Опции темы
iAnthony
Дата 20.1.2009, 15:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 30
Регистрация: 19.1.2009
Где: Moscow

Репутация: нет
Всего: нет



Здравствуйте!

Подскажите, пожалуйста, как можно в один объект импортировать набор функций другого?

Немного подробнее:
1. Я получаю хендл объекта, и мне надо добавить ему несколько своих функций
2. Для удобства вынес их в отдельный класс и пытаюсь добавлять в хендл объекта

При обычном раскладе делал так:
Код

Handle = document.getElementById('someelement');

Handle.MyFunction = function(){
   alert('Cool!');
}

, а сейчас пробую нечно такое:

Код

CLASS_Function = function(){
   this.MyFunction = MyFunction;
   MyFunction = function(){
      alert('Cool!');
   }
}

Handle = document.getElementById('someelement');
Handle.push(CLASS_Function);

это, конечно, бред, но думаю из этого видно идею того что я хочу сделать.

Заранее благодарен за помощь!

Это сообщение отредактировал(а) iAnthony - 26.2.2009, 21:35
PM MAIL   Вверх
iAnthony
Дата 20.1.2009, 16:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 30
Регистрация: 19.1.2009
Где: Moscow

Репутация: нет
Всего: нет



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

Код

function __modify(handle){
   _getElementsByTagName = handle.getElementsByTagName;
   handle.prototype.getElementsByTagName = function(id){
      var rusult = _getElementsByTagName(id);
      for(var i=0; i<rusult.length; i++){
         result[i] = __modify(result[i]);
      }
      return result;
   }
   handle.MyFunction(){
      alert('Cool!');
   }
}


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

Вопрос все равно остается открытым, может у кого-нибудь будут какие мысли/предложения/идеи, или может есть какие-нибудь недочеты или ошибки в моем примере.

Это сообщение отредактировал(а) iAnthony - 26.2.2009, 21:35
PM MAIL   Вверх
iAnthony
Дата 20.1.2009, 17:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 30
Регистрация: 19.1.2009
Где: Moscow

Репутация: нет
Всего: нет



Хм, прототип getElementsByTagName не работает "handle.prototype is undefined".
Как же тогда быть?

Убрал prototype  - скрипт перестал ругаться, но пока не проверял его работоспособность.

Это сообщение отредактировал(а) iAnthony - 20.1.2009, 17:27
PM MAIL   Вверх
iAnthony
Дата 20.1.2009, 21:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 30
Регистрация: 19.1.2009
Где: Moscow

Репутация: нет
Всего: нет



c getElementsByTagName получилось, но пришлось его вынести за функцию:

Код

var _getElementsByTagName = document.getElementsByTagName;
document.getElementsByTagName = function(id){
    var result = _getElementsByTagName(id);        
    for(var i=0; i<result.length; i++)
        result[i] = __modify(result[i]);

    return result;
}


а вот с getElementById такое не проходит почему-то:
Код

var _getElementById = document.getElementById;
document.getElementById = function(id){
    var result = _getElementById(id);        
    result = __modify(result);

    return result;
}


при обращении к document.getElementById() браузер начинает ругаться, например Firefox выдает следующее:
Код

Ошибка: uncaught exception: [Exception... "Illegal operation on WrappedNative prototype object"  nsresult: "0x8057000c (NS_ERROR_XPC_BAD_OP_ON_WN_PROTO)"  location: "JS frame :: http://localweb.ru/test.html :: anonymous :: line 28"  data: no]


Кто-нибудь знает почему такое случается и как это исправить?
PM MAIL   Вверх
Aliance
Дата 21.1.2009, 10:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


I ♥ <script>
****


Профиль
Группа: Модератор
Сообщений: 6418
Регистрация: 2.8.2004
Где: spb

Репутация: 55
Всего: 137



Цитата(iAnthony @  20.1.2009,  18:22 Найти цитируемый пост)
Хм, прототип getElementsByTagName не работает "handle.prototype is undefined".

Прототип существует у объектов, а не у методов.

Для создания имитации виртуального наследования в JS (в ООП-языках, эти конструкции называются interface и implements), используются два подхода:
  • Создание дочернего класса
  • Использование метода clone()

1) Создание дочернего класса
Рассмотрим пример:
Код

// Конструктор объекта Форум
function forum( title, url )
{
    this.title = title;
    this.url = url;
}
// Конструктор объекта Винград
function vingrad( title, url, newValue)
{
    this.val = newValue;
    // назначаем методу this.forum ссылку на родительский конструктор forum
    this.forum = forum;
    this.forum( title, url );
}


Этот подход имеет минус: при добавлении какого-либо свойства конструктору forum, объект vingrad не получит это свойство в свой прототип. Но этот минус легко исправляется. Для этого необходимо назначить в качестве прототипа vingrad пустой объект forum:
Код

vingrad.prototype = new forum();

И это необходимо сделать ДО первого вызова конструктора vingrad

2) Написание функции clone():
Родной функции clone() в JS не существует, но в интернете можно найти много ее реализаций. Например:
Код

function clone(o) {
 if(!o || ‘object’ !== typeof o)  {
   return o;
 }
 varc = ‘function’ === typeof o.pop ? [] : {};
 var p, v;
 for(p in o) {
 if(o.hasOwnProperty(p)) {
  v = o[p];
  if(v && ‘object’ === typeof v) {
    c[p] = clone(v);
  }
  else {
    c[p] = v;
  }
 }
}
 return c;
}

PM MAIL WWW ICQ Skype   Вверх
iAnthony
Дата 21.1.2009, 12:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 30
Регистрация: 19.1.2009
Где: Moscow

Репутация: нет
Всего: нет



Спасибо огромное за такой развернутый ответ, попробую поэксперементировать!
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Форум для вопросов, которые имеются в справочниках, но их поиск вызвал затруднения, или для разработчика требуется совет или просьба отыскать ошибку. Напоминаем: 1) чётко формулируйте вопрос, 2) приведите пример того, что уже сделано, 3) укажите явно, нужен работающий пример или подсказка о том, где найти информацию.
 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | JavaScript: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0702 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.