Изменение прототипа функции
Здравствуйте!
Хочу переписать прототип функции так, чтобы при каждом вызове любой функции выполнялось какое либо действие. Например "console.log('hello!')". Я знаю что это делать нельзя и руки за это обрывают, но делаю это для себя просто чтобы лучше понимать как работают функции. Опытным путём набирая в консоли и гугля я наткнулся на то что все функции при вызове используют Function.prototype.call, и пришёл к выводу что его надо както дописать, но столкнулся с проблемой, что я не могу продолжить вызов call во время изменения прототипа и вместо того чтобы функция выполнялась и выводила надпись - все функции выводят надпись и больше ничего не делают. |
Функции в JavaScript – это объекты с внутренним методом [[Call]]. Это не одно и то же, что Function.prototype.call. Получить доступ к [[Call]] и как-то изменить его средствами JavaScript невозможно.
|
Да, это я знаю. я просто хотел попытаться встроить какой-то вызов перед каждым [[call]]
|
(function() { var tmp = Function.prototype.call; Function.prototype.call = function() { console.log('hello'); tmp.apply(this, arguments); } })(); function test() { alert(1); } test.call(); Вот так что ли? |
Ruslan_xDD,
Да, именно так! Я затупил и думал что функция будет передаваться ссылкой и изменение call перетрёт tmp :( |
Цитата:
Цитата:
Цитата:
|
Octane, он (Ruslan_xDD) просто не понял задумку)
Цитата:
Function.prototype.call = (function(method) { return function() { alert(1); return method.apply(this, arguments); }; }(Function.prototype.call)); function test() {} test.call(); // 1 test(); // Цитата:
function wrap(method) { return function() { alert('your code'); return method.apply(this, arguments); }; } console.log = wrap(console.log); console.log(1); |
Нерв ты не прав =).
|
Ruslan_xDD, переопределяет функцию Function.prototype.call на которую благоразумно сохранил ссылку. а ты переопределяешь уже свою функцию т.е. Function.prototype.call уже указывает на твою функцию а не на prototype.call
|
Цитата:
|
Часовой пояс GMT +3, время: 00:11. |