Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 05.01.2014, 15:24
Профессор
Отправить личное сообщение для Shitbox2 Посмотреть профиль Найти все сообщения от Shitbox2
 
Регистрация: 04.10.2010
Сообщений: 571

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


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


Т.е. нужно переопределить метод так, чтобы он вызывал старый метод, но перед этим производил какие-то дополнительные действия. Старый метод может использовать this объекта, что так же необходимо учитывать.
Ответить с цитированием
  #2 (permalink)  
Старый 05.01.2014, 15:54
Аватар для danik.js
Профессор
Отправить личное сообщение для danik.js Посмотреть профиль Найти все сообщения от danik.js
 
Регистрация: 11.09.2010
Сообщений: 8,804

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();
__________________
В личку только с интересными предложениями
Ответить с цитированием
  #3 (permalink)  
Старый 05.01.2014, 16:06
Профессор
Отправить личное сообщение для Shitbox2 Посмотреть профиль Найти все сообщения от Shitbox2
 
Регистрация: 04.10.2010
Сообщений: 571

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

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

obj.method2 = function(params) {
  //Какие-то действия
  return oldMethod2(params);
}
Ответить с цитированием
  #4 (permalink)  
Старый 05.01.2014, 16:18
Профессор
Отправить личное сообщение для BallsShaped Посмотреть профиль Найти все сообщения от BallsShaped
 
Регистрация: 14.09.2012
Сообщений: 162

Так?
someObj.method = function (origin) {
    return function () {
        //Какие-то действия
        
        origin.apply(this, arguments);
    };
} (someObj.method);
Ответить с цитированием
  #5 (permalink)  
Старый 05.01.2014, 20:43
Аватар для danik.js
Профессор
Отправить личное сообщение для danik.js Посмотреть профиль Найти все сообщения от danik.js
 
Регистрация: 11.09.2010
Сообщений: 8,804

Сообщение от 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 нету в старых ишаках.
__________________
В личку только с интересными предложениями
Ответить с цитированием
  #6 (permalink)  
Старый 05.01.2014, 22:04
Профессор
Отправить личное сообщение для Shitbox2 Посмотреть профиль Найти все сообщения от Shitbox2
 
Регистрация: 04.10.2010
Сообщений: 571

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

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

Последний раз редактировалось Shitbox2, 05.01.2014 в 22:10.
Ответить с цитированием
  #7 (permalink)  
Старый 05.01.2014, 22:07
Профессор
Отправить личное сообщение для Shitbox2 Посмотреть профиль Найти все сообщения от Shitbox2
 
Регистрация: 04.10.2010
Сообщений: 571

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



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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как обратиться к переменной внутри объекта, в произвольной функцию через его метод platedz Элементы интерфейса 15 25.08.2012 00:03
Как использовать sprit'ы? Hekumok Общие вопросы Javascript 17 10.08.2012 11:24
Как в метод slice вместо числа подставить переменную leny Ваши сайты и скрипты 15 07.07.2011 23:06
О наследовании событий, или как корректно его отменить. JCShen Events/DOM/Window 8 09.02.2010 00:00
Добавить свой метод к элементу alekciy Events/DOM/Window 6 16.02.2009 19:29