Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Как расширить метод в объекте? (https://javascript.ru/forum/misc/44076-kak-rasshirit-metod-v-obekte.html)

Shitbox2 05.01.2014 15:24

Как расширить метод в объекте?
 
Дано:
{
  method1: function(params) {...},
  method2: function(params) {...}
}


Нужно:
{
  method1: function(params) {...},
  method2: function(params) {
    //Какие-то действия
    return this.method2(params)
  }
}


Т.е. нужно переопределить метод так, чтобы он вызывал старый метод, но перед этим производил какие-то дополнительные действия. Старый метод может использовать this объекта, что так же необходимо учитывать.

danik.js 05.01.2014 15:54

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

Shitbox2 05.01.2014 16:06

Не факт, что методы будут в прототипе и instance это уже новый объект, а мы, по сути, расширяем методы уже существующего экземпляра, не теряя ссылку на него.

Можно так сделать, но думал, что можно без сохранения методов обойтись...
var obj = new Obj
var oldMethod2 = obj.method2;

obj.method2 = function(params) {
  //Какие-то действия
  return oldMethod2(params);
}

BallsShaped 05.01.2014 16:18

Так?
someObj.method = function (origin) {
    return function () {
        //Какие-то действия
        
        origin.apply(this, arguments);
    };
} (someObj.method);

danik.js 05.01.2014 20:43

Цитата:

Сообщение от Shitbox2
Можно так сделать, но думал, что можно без сохранения методов обойтись...

Неа. Если через жопу сделано изначально, то и "наследование" тоже будет через жопу.

Можно еще так:
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 нету в старых ишаках.

Shitbox2 05.01.2014 22:04

Тоже к такому пришел. Правда, не люблю использовать замыкания из-за их сложности...

P.S. Вернул как было. Некрасиво с замыканием. Строчек столько же, а мусора и непонятности больше

Shitbox2 05.01.2014 22:07

Цитата:

Object.create(base);
А ссылка, ссылка-то опять потерялась? Ссылка на base используется в куче мест и extended уже новый объект


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