2010-01-24 3 views
15

Есть ли способ добавить метод ко всем функциям javascript без использования библиотеки прототипов?javascript добавить метод прототипа ко всем функциям?

что-то вдоль линий:

Function.prototype.methodName = function(){ 


    return dowhateverto(this) 

}; 

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

если так что я могу добавить к набору функций я выбираю

что-то вроде:

MyFunctions.prototype.methodName = function(){ 


    return dowhateverto(this) 

}; 

где MyFunctions является массив имен функций

спасибо

+0

http://www.packtpub.com/article/using-prototype-property-in-javascript – jjj

+1

Расширение встроенных объектов JavaScript - это плохая практика. – jerone

ответ

25

Несомненно. Функции являются объектами:

var foo = function() {}; 

Function.prototype.bar = function() { 
    alert("bar"); 
}; 

foo.bar(); 

предупредит «бар»

+0

Этот фрагмент кода предполагает, что 'foo' был объявлен ранее, иначе' foo' является подразумеваемым глобальным (плохим!). Возможно, измените оператор объявления на 'var foo = function() {};' для усиления хорошей практики ...? –

+0

Ну, это не совсем хороший стиль, чтобы вначале изменить прототип базовых объектов. Но я согласен. – troelskn

1
function one(){ 
    alert(1); 
} 
function two(){ 
    alert(2); 
} 

var myFunctionNames = ["one", "two"]; 

for(var i=0; i<myFunctionNames.length; i++) { 
    // reference the window object, 
    // since the functions 'one' and 'two are in global scope 
    Function.prototype[myFunctionNames[i]] = window[myFunctionNames[i]]; 
} 


function foo(){} 

foo.two(); // will alert 2 
1

Изменение JS встроенных объектов может дать вам несколько сюрпризов.
Если вы добавляете внешние библиотеки или меняете версию одного из них, вы никогда не будете уверены, что они не будут перезаписывать расширение.

+0

Ваша ссылка мертва. – luckydonald

+0

@luckydonald, спасибо за комментарий – Mic

1

Попробуйте Object.prototype вместо:

Object.prototype.methodName = function(){ 

    return dowhateverto(this) 
}; 

Но также учесть предупреждение, что расширение родные объекты не всегда хорошая идея.

Функция.прототип не может быть надежно обработан в Javascript; это не реальный объект, потому что конструктор Function() должен возвращать функцию, а не объект. Но вы не можете относиться к нему как к нормальной функции. Его поведение при попытке доступа к его свойствам может быть неопределенным и варьироваться между браузерами. См. Также this question.