Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 12.05.2014, 17:25
Профессор
Отправить личное сообщение для tsigel Посмотреть профиль Найти все сообщения от tsigel
 
Регистрация: 12.12.2012
Сообщений: 1,398

Изменение прототипа функции
Здравствуйте!

Хочу переписать прототип функции так, чтобы при каждом вызове любой функции выполнялось какое либо действие. Например "console.log('hello!')". Я знаю что это делать нельзя и руки за это обрывают, но делаю это для себя просто чтобы лучше понимать как работают функции.

Опытным путём набирая в консоли и гугля я наткнулся на то что все функции при вызове используют Function.prototype.call, и пришёл к выводу что его надо както дописать, но столкнулся с проблемой, что я не могу продолжить вызов call во время изменения прототипа и вместо того чтобы функция выполнялась и выводила надпись - все функции выводят надпись и больше ничего не делают.
Ответить с цитированием
  #2 (permalink)  
Старый 12.05.2014, 18:45
Отправить личное сообщение для Octane Посмотреть профиль Найти все сообщения от Octane  
Регистрация: 10.07.2008
Сообщений: 3,873

Функции в JavaScript – это объекты с внутренним методом [[Call]]. Это не одно и то же, что Function.prototype.call. Получить доступ к [[Call]] и как-то изменить его средствами JavaScript невозможно.
Ответить с цитированием
  #3 (permalink)  
Старый 12.05.2014, 21:21
Профессор
Отправить личное сообщение для tsigel Посмотреть профиль Найти все сообщения от tsigel
 
Регистрация: 12.12.2012
Сообщений: 1,398

Да, это я знаю. я просто хотел попытаться встроить какой-то вызов перед каждым [[call]]
Ответить с цитированием
  #4 (permalink)  
Старый 13.05.2014, 06:57
Аватар для ruslan_mart
Профессор
Отправить личное сообщение для ruslan_mart Посмотреть профиль Найти все сообщения от ruslan_mart
 
Регистрация: 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();


Вот так что ли?
Ответить с цитированием
  #5 (permalink)  
Старый 13.05.2014, 09:42
Профессор
Отправить личное сообщение для tsigel Посмотреть профиль Найти все сообщения от tsigel
 
Регистрация: 12.12.2012
Сообщений: 1,398

Ruslan_xDD,
Да, именно так! Я затупил и думал что функция будет передаваться ссылкой и изменение call перетрёт tmp
Ответить с цитированием
  #6 (permalink)  
Старый 13.05.2014, 20:13
Отправить личное сообщение для Octane Посмотреть профиль Найти все сообщения от Octane  
Регистрация: 10.07.2008
Сообщений: 3,873

Сообщение от tsigel
Хочу переписать прототип функции так, чтобы при каждом вызове любой функции выполнялось какое либо действие.
Сообщение от Ruslan_xDD
test.call();
Сообщение от tsigel
Да, именно так!
Как это не вяжется с первоначальной задумкой. func.call() - это не каждый вызов любой функции…
Ответить с цитированием
  #7 (permalink)  
Старый 13.05.2014, 22:23
Аватар для nerv_
junior
Отправить личное сообщение для nerv_ Посмотреть профиль Найти все сообщения от nerv_
 
Регистрация: 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);
__________________
Чебурашка стал символом олимпийских игр. А чего достиг ты?
Тишина - самый громкий звук
Ответить с цитированием
  #8 (permalink)  
Старый 14.05.2014, 01:17
Аватар для MallSerg
Профессор
Отправить личное сообщение для MallSerg Посмотреть профиль Найти все сообщения от MallSerg
 
Регистрация: 07.03.2011
Сообщений: 1,127

Нерв ты не прав =).
Ответить с цитированием
  #9 (permalink)  
Старый 14.05.2014, 01:24
Аватар для MallSerg
Профессор
Отправить личное сообщение для MallSerg Посмотреть профиль Найти все сообщения от MallSerg
 
Регистрация: 07.03.2011
Сообщений: 1,127

Ruslan_xDD, переопределяет функцию Function.prototype.call на которую благоразумно сохранил ссылку. а ты переопределяешь уже свою функцию т.е. Function.prototype.call уже указывает на твою функцию а не на prototype.call
Ответить с цитированием
  #10 (permalink)  
Старый 14.05.2014, 02:07
Аватар для nerv_
junior
Отправить личное сообщение для nerv_ Посмотреть профиль Найти все сообщения от nerv_
 
Регистрация: 29.11.2011
Сообщений: 3,924

Сообщение от MallSerg
Ruslan_xDD, переопределяет функцию Function.prototype.call на которую благоразумно сохранил ссылку. а ты переопределяешь уже свою функцию т.е. Function.prototype.call уже указывает на твою функцию а не на prototype.call
иди учи яваскрипт)
__________________
Чебурашка стал символом олимпийских игр. А чего достиг ты?
Тишина - самый громкий звук
Ответить с цитированием
Ответ



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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Создание прототипа функции Chiz Events/DOM/Window 8 30.10.2013 22:31
Изменение свойств прототипа FanAizu Общие вопросы Javascript 5 23.08.2013 21:13
Изменение глобальной переменной из функции SunYang Общие вопросы Javascript 1 06.11.2012 00:03
изменение переменной в функции ananax Общие вопросы Javascript 19 12.01.2011 12:09
изменение текущего контекста функции vkovalev jQuery 13 16.03.2009 12:52