Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Замена конструктора класса (https://javascript.ru/forum/misc/7911-zamena-konstruktora-klassa.html)

Григорий J 25.02.2010 16:42

Замена конструктора класса
 
Ребята, подскажите, пожалуйста, если кто с этим сталкивался.
Как изменить конструктор класса? - есть готовый класс 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');

Kolyaj 25.02.2010 16:51

Нужно отнаследовать какой-нибудь C от A, после чего
A = C;

Григорий J 25.02.2010 17:13

в приведенной статье используется функция extend(c1,c2), которая в результате полностью заменяет конструктор родительского класса. это совсем не то что нужно. Нужна обертка для конструктора класса.

Kolyaj 25.02.2010 17:23

var oldA = A;
A = function() {
    B();
    return oldA.apply(this, arguments);
};

Григорий J 25.02.2010 17:31

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

класс A теряет все свои проперти и становится объектом-функцией..

Kolyaj 25.02.2010 17:46

Возвращает-то он объект конструктора oldA. Если нужно свойства ещё какие-то -- так восстановите.

vk65535 25.02.2010 18:03

(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');

})();

vinet 15.04.2011 16:08

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

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


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

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

var Original = new Class({
dosome: function () { CallOther (); this.parent(args); }
});

vinet 15.04.2011 16:33

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

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


Правильно ли так делать?


Часовой пояс GMT +3, время: 17:24.