Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 25.02.2010, 16:42
Новичок на форуме
Отправить личное сообщение для Григорий J Посмотреть профиль Найти все сообщения от Григорий J
 
Регистрация: 25.02.2010
Сообщений: 3

Замена конструктора класса
Ребята, подскажите, пожалуйста, если кто с этим сталкивался.
Как изменить конструктор класса? - есть готовый класс A (в его код лезть нельзя)
его реализация следующая:
function A(name) { this.name=name; this.getName() }
A.prototype.getName = function(){ alert(this.name)}

всё просто.

есть еще функция B = function() { alert('foo');}

как правильно реализовать подмену, чтобы была следующая логика?
(function(){

var old_construct = A.prototype.constructor ;

A.prototype.constructor = function() { 
B(); //выполненеие моего кода
old_construct.apply(this,arguments); // исполнение оригинального конструктора
}

})()

то есть, чтобы после вызова
var v1 = new A('test');
сначала произошел alert('foo'), a потом alert('test');

Последний раз редактировалось Григорий J, 25.02.2010 в 16:44.
Ответить с цитированием
  #2 (permalink)  
Старый 25.02.2010, 16:51
Новичок на форуме
Отправить личное сообщение для Kolyaj Посмотреть профиль Найти все сообщения от Kolyaj
 
Регистрация: 19.02.2008
Сообщений: 9,177

Нужно отнаследовать какой-нибудь C от A, после чего
A = C;
Ответить с цитированием
  #3 (permalink)  
Старый 25.02.2010, 17:13
Новичок на форуме
Отправить личное сообщение для Григорий J Посмотреть профиль Найти все сообщения от Григорий J
 
Регистрация: 25.02.2010
Сообщений: 3

в приведенной статье используется функция extend(c1,c2), которая в результате полностью заменяет конструктор родительского класса. это совсем не то что нужно. Нужна обертка для конструктора класса.
Ответить с цитированием
  #4 (permalink)  
Старый 25.02.2010, 17:23
Новичок на форуме
Отправить личное сообщение для Kolyaj Посмотреть профиль Найти все сообщения от Kolyaj
 
Регистрация: 19.02.2008
Сообщений: 9,177

var oldA = A;
A = function() {
    B();
    return oldA.apply(this, arguments);
};
Ответить с цитированием
  #5 (permalink)  
Старый 25.02.2010, 17:31
Новичок на форуме
Отправить личное сообщение для Григорий J Посмотреть профиль Найти все сообщения от Григорий J
 
Регистрация: 25.02.2010
Сообщений: 3

С этого я и начинал.)) Дело в том, что после
A = function() {...}

класс A теряет все свои проперти и становится объектом-функцией..
Ответить с цитированием
  #6 (permalink)  
Старый 25.02.2010, 17:46
Новичок на форуме
Отправить личное сообщение для Kolyaj Посмотреть профиль Найти все сообщения от Kolyaj
 
Регистрация: 19.02.2008
Сообщений: 9,177

Возвращает-то он объект конструктора oldA. Если нужно свойства ещё какие-то -- так восстановите.
Ответить с цитированием
  #7 (permalink)  
Старый 25.02.2010, 18:03
Кандидат Javascript-наук
Отправить личное сообщение для vk65535 Посмотреть профиль Найти все сообщения от vk65535
 
Регистрация: 21.11.2008
Сообщений: 114

(function() {

function A(name) { this.name=name; this.getName() }
A.prototype.getName = function(){ alert(this.name)}
B = function() { alert('foo'); };

var newA = function(name) { B(); this.constructor(name); }
newA.prototype = A.prototype;
A = newA;

new A('test');

})();

Последний раз редактировалось vk65535, 25.02.2010 в 18:16.
Ответить с цитированием
  #8 (permalink)  
Старый 15.04.2011, 16:08
Интересующийся
Отправить личное сообщение для vinet Посмотреть профиль Найти все сообщения от vinet
 
Регистрация: 07.01.2010
Сообщений: 13

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

Есть объявление класса:
var Original = new Class({ 
  dosome: function () {  alert('do: orig'); }
});


нужно внедрить в этот класс в функцию dosome вызов другой функции CallOther ().

Т.е. заменить объект dosome () своим кодом и после этого вызвать оригинальный т.е. чтобы стало:

var Original = new Class({
dosome: function () { CallOther (); this.parent(args); }
});
Ответить с цитированием
  #9 (permalink)  
Старый 15.04.2011, 16:33
Интересующийся
Отправить личное сообщение для vinet Посмотреть профиль Найти все сообщения от vinet
 
Регистрация: 07.01.2010
Сообщений: 13

Вот что у меня получилось:

var OriginalCopy = new Class ();
  OriginalCopy.prototype.dosome= Original.prototype.dosome;
  Original.prototype.dosome= function () {
    alert(arguments);
    OriginalCopy.prototype.dosome.apply (this, arguments);
  }


Правильно ли так делать?
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Замена слова посредством Java-script Assassin Общие вопросы Javascript 33 11.11.2014 22:23
Вопрос про ООП, цепочки прототипов. Shaci Общие вопросы Javascript 5 27.01.2010 14:50
Замена CSS класса каждого четвертого div iGusse jQuery 4 17.12.2009 23:51
Явный вызов конструктора Tim Серверные языки и технологии 2 04.10.2009 23:28
Замена слов в тексте Dan T Общие вопросы Javascript 8 18.03.2009 12:36