Как расширить метод в объекте?
Дано:
{ 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, время: 05:47. |