2015-11-05 2 views
0

Кто-то спросил меня об этом, и я не уверен, как это сделать. Буду признателен за любую помощь.Переопределить собственный метод Javascript и вызвать супер

Вопрос: Когда вы вызываете Array.push(), он должен толкнуть как обычно, а также сделать вызов пользовательской функции.

Вот моя попытка:

Array.prototype.push = function() { 
    Array.prototype.push.call(this, arguments); 
    if(typeof customMethod === 'function') { 
    customMethod(); 
    } 
} 

function customMethod() { 
    console.log('customMethod called'); 
} 

Но это не работает.

+0

Где/как 'customMethod' определено? Поскольку ваш код появится сейчас, он не будет определен. –

+1

вы переопределяете 'push', не сохраняя оригинальный ... – Hacketo

ответ

2

Это не сработает, потому что вы ссылаетесь на тот же метод и вызывают рекурсию. Вам нужно будет сохранить оригинальный «супер» метод, а затем переопределить его для достижения желаемого эффекта.

Вот как это будет работать:

Array.prototype._push = Array.prototype.push; 

Array.prototype.push = function() { 
    this._push.apply(this, arguments); 

    if(typeof customMethod === 'function') { 
    customMethod(); 
    } 
}; 

function customMethod() { 
    console.log('called custom method'); 
} 

var a = []; 

a.push(1); 
a.push(2); 

console.log(a); 
2

Вам необходимо сделать резервную копию оригинальной реализации и называть это, иначе вы попадете в бесконечную рекурсию.

Array.prototype._old_push = Array.prototype.push; 
Array.prototype.push = function() { 
    Array.prototype._old_push.call(this, arguments); 
    if(typeof customMethod === 'function') { 
     customMethod(); 
    } 
} 
0

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

Но если вам нужно это сделать, вы можете сохранить старый толчок и повторно использовать его.

Array.prototype._oldPush = Array.prototype.push; 
Array.prototype.push = function() { 
    Array.prototype._oldPush.call(this, arguments); 
    if(typeof customMethod === 'function') { 
    customMethod(); 
    } 
} 

Вместо этого попробуйте использовать внешний метод, который делает материал.

function CustomPush(array, datas) { 
    Array.prototype.push.call(array, datas); 
    if(typeof customMethod === 'function') { 
     customMethod(); 
    } 
} 
Смежные вопросы