|
12.05.2014, 17:25
|
Профессор
|
|
Регистрация: 12.12.2012
Сообщений: 1,398
|
|
Изменение прототипа функции
Здравствуйте!
Хочу переписать прототип функции так, чтобы при каждом вызове любой функции выполнялось какое либо действие. Например "console.log('hello!')". Я знаю что это делать нельзя и руки за это обрывают, но делаю это для себя просто чтобы лучше понимать как работают функции.
Опытным путём набирая в консоли и гугля я наткнулся на то что все функции при вызове используют Function.prototype.call, и пришёл к выводу что его надо както дописать, но столкнулся с проблемой, что я не могу продолжить вызов call во время изменения прототипа и вместо того чтобы функция выполнялась и выводила надпись - все функции выводят надпись и больше ничего не делают.
|
|
12.05.2014, 18:45
|
|
|
Регистрация: 10.07.2008
Сообщений: 3,873
|
|
Функции в JavaScript – это объекты с внутренним методом [[Call]]. Это не одно и то же, что Function.prototype.call. Получить доступ к [[Call]] и как-то изменить его средствами JavaScript невозможно.
|
|
12.05.2014, 21:21
|
Профессор
|
|
Регистрация: 12.12.2012
Сообщений: 1,398
|
|
Да, это я знаю. я просто хотел попытаться встроить какой-то вызов перед каждым [[call]]
|
|
13.05.2014, 06:57
|
|
Профессор
|
|
Регистрация: 30.04.2012
Сообщений: 3,018
|
|
(function() {
var tmp = Function.prototype.call;
Function.prototype.call = function() {
console.log('hello');
tmp.apply(this, arguments);
}
})();
function test() {
alert(1);
}
test.call();
Вот так что ли?
|
|
13.05.2014, 09:42
|
Профессор
|
|
Регистрация: 12.12.2012
Сообщений: 1,398
|
|
Ruslan_xDD,
Да, именно так! Я затупил и думал что функция будет передаваться ссылкой и изменение call перетрёт tmp
|
|
13.05.2014, 20:13
|
|
|
Регистрация: 10.07.2008
Сообщений: 3,873
|
|
Сообщение от tsigel
|
Хочу переписать прототип функции так, чтобы при каждом вызове любой функции выполнялось какое либо действие.
|
Сообщение от Ruslan_xDD
|
test.call();
|
Сообщение от tsigel
|
Да, именно так!
|
Как это не вяжется с первоначальной задумкой. func.call() - это не каждый вызов любой функции…
|
|
13.05.2014, 22:23
|
|
junior
|
|
Регистрация: 29.11.2011
Сообщений: 3,924
|
|
Octane, он ( Ruslan_xDD) просто не понял задумку)
Сообщение от tsigel
|
Опытным путём набирая в консоли и гугля я наткнулся на то что все функции при вызове используют Function.prototype.call
|
это не так
Function.prototype.call = (function(method) {
return function() {
alert(1);
return method.apply(this, arguments);
};
}(Function.prototype.call));
function test() {}
test.call(); // 1
test(); //
Сообщение от tsigel
|
Хочу переписать прототип функции так, чтобы при каждом вызове любой функции выполнялось какое либо действие. Например "console.log('hello!')". Я знаю что это делать нельзя и руки за это обрывают, но делаю это для себя просто чтобы лучше понимать как работают функции.
|
напиши враппер:
function wrap(method) {
return function() {
alert('your code');
return method.apply(this, arguments);
};
}
console.log = wrap(console.log);
console.log(1);
__________________
Чебурашка стал символом олимпийских игр. А чего достиг ты?
Тишина - самый громкий звук
|
|
14.05.2014, 01:17
|
|
Профессор
|
|
Регистрация: 07.03.2011
Сообщений: 1,138
|
|
Нерв ты не прав =).
|
|
14.05.2014, 01:24
|
|
Профессор
|
|
Регистрация: 07.03.2011
Сообщений: 1,138
|
|
Ruslan_xDD, переопределяет функцию Function.prototype.call на которую благоразумно сохранил ссылку. а ты переопределяешь уже свою функцию т.е. Function.prototype.call уже указывает на твою функцию а не на prototype.call
|
|
14.05.2014, 02:07
|
|
junior
|
|
Регистрация: 29.11.2011
Сообщений: 3,924
|
|
Сообщение от MallSerg
|
Ruslan_xDD, переопределяет функцию Function.prototype.call на которую благоразумно сохранил ссылку. а ты переопределяешь уже свою функцию т.е. Function.prototype.call уже указывает на твою функцию а не на prototype.call
|
иди учи яваскрипт)
__________________
Чебурашка стал символом олимпийских игр. А чего достиг ты?
Тишина - самый громкий звук
|
|
|
|