Как расширить метод в объекте?
Дано:
{
method1: function(params) {...},
method2: function(params) {...}
}
Нужно:
{
method1: function(params) {...},
method2: function(params) {
//Какие-то действия
return this.method2(params)
}
}
Т.е. нужно переопределить метод так, чтобы он вызывал старый метод, но перед этим производил какие-то дополнительные действия. Старый метод может использовать this объекта, что так же необходимо учитывать. |
function Base() { }
Base.prototype.method1 = function(params) {/*...*/};
Base.prototype.method2 = function(params) { alert('base method'); };
function Extended() { }
Extended.prototype = Object.create(Base.prototype);
Extended.prototype.method2 = function(params) {
alert('extended method');
Base.prototype.method2.apply(this, arguments);
};
var instance = new Extended();
instance.method2();
|
Не факт, что методы будут в прототипе и instance это уже новый объект, а мы, по сути, расширяем методы уже существующего экземпляра, не теряя ссылку на него.
Можно так сделать, но думал, что можно без сохранения методов обойтись...
var obj = new Obj
var oldMethod2 = obj.method2;
obj.method2 = function(params) {
//Какие-то действия
return oldMethod2(params);
}
|
Так?
someObj.method = function (origin) {
return function () {
//Какие-то действия
origin.apply(this, arguments);
};
} (someObj.method);
|
Цитата:
Можно еще так:
var base = {
method1: function() {},
method2: function() {
alert('base method');
}
};
var extended = Object.create(base);
extended.method2 = function() {
alert('extended method');
Object.getPrototypeOf(this).method2.apply(this, arguments);
};
extended.method2();
getPrototypeOf нету в старых ишаках. |
Тоже к такому пришел. Правда, не люблю использовать замыкания из-за их сложности...
P.S. Вернул как было. Некрасиво с замыканием. Строчек столько же, а мусора и непонятности больше |
Цитата:
|
| Часовой пояс GMT +3, время: 23:26. |