2015-09-15 5 views
3

У меня есть функция, которая уже была назначена, и я хотел бы добавить дополнительный скрипт. Когда я отображения функции, как:Как динамически изменять функцию

var func = obj.when_clicked; 
alert(func); 

отображается следующее:

function object_123(){ 
    object_123_Action(); 
} 

Тип является «функция» и функция выполняется в другом месте, которое я не могу изменить, код:

this.when_clicked(); 

Мне нужно изменить функцию, присоединяя свой собственный код, чтобы он становится:

function object_123(){ 
    object_123_Action(); 
    my_clicked(obj); 
} 

Затем добавьте это обратно и напишите функцию when_clicked.

Это действительно работает, если я вручную добавить код как:

obj.when_clicked = function object_123(){object_123_Action();my_clicked(obj);}; 

Однако, я не знаю, что в функции первоначально, все, что я хочу, чтобы присоединить:

my_clicked(obj); 

Мне нужен obj, чтобы быть фактическим объектом интереса, который является объектом.

ответ

5

Вы можете обернуть его:

var f = this.when_clicked; 
this.when_clicked = function() { 
    // Call the original 
    var rv = f.apply(this, arguments); 

    // your code here 

    // Return the original function's return value 
    return rv; 
}; 

Function#apply называет оригинал с указанным this флагом. arguments предоставляется движком JavaScript: это псевдо-массив аргументов, с которыми была вызвана ваша функция, поэтому приведенное выше просто передает их все.

Обязательно подумайте над тем, что это означает, если ваша функция выдает исключение и поймает их, если вы хотите их подавить.

Если вы делаете это часто, вы можете giev себе функцию полезности:

function wrapFunction(f, wrapper) { 
    return function() { 
     var rv = f.apply(this, arguments); 
     wrapper.apply(this, arguments); 
     return rv; 
    }; 
} 

Тогда

this.when_clicked = wrapFunction(this.when_clicked, function() { 
    // Your code here 
}); 

Или, если вы хотите получить доступ к возвращаемому значению оригинала, потенциально изменяя его:

function wrapFunction(f, wrapper) { 
    return function() { 
     var rv = f.apply(this, arguments); 
     rv = wrapper.call(this, rv, arguments); 
     return rv; 
    }; 
} 

Затем

this.when_clicked = wrapFunction(this.when_clicked, function(rv, args) { 
    // Your code here, using `rv` and `args`, which is a pseudo-array 

    // Potentially update `rv` 

    return rv; 
}); 
+0

Большое спасибо, к сожалению, это не работает. Может быть, я должен спросить, как сделать строку в функцию, которая впоследствии может быть выполнена. Строкой будет «function when_clicked() {do_some_action();}». поэтому, когда мы делаем this.func(); do_some_action() будет запущен. благодаря – Peter

0

Вы можете хранить свои функции в массиве на объекте. Затем зациклируйте функции в другой функции и выполните их.

var myObj = { 'myfunctions': [ ] }; 

и добавить функции:

myObj.myFunctions.push (function() { /*function code here*/ }); 

Или, если у вас уже есть с именем функции:

myObj.myFunctions.push (nameOfFunction); 

И называть все функции, использовать эту функцию (не добавлять эта функция для myObj)

function executeMyFunctions (myObj) { 
    for (var i = 0; i < myObj.myFunctions.length; i++) { 
     myObj.myFunctions[i](); 
    } 
} 

Используется этот ответ на другой вопрос @peter. Предназначен для публикации здесь.

Смежные вопросы