2010-01-24 8 views
15

Gibt es eine Möglichkeit, eine Methode zu allen JavaScript-Funktionen hinzuzufügen, ohne die Prototyp-Bibliothek zu verwenden?Javascript Prototyp-Methode zu allen Funktionen hinzufügen?

etwas entlang der Linien von:

Function.prototype.methodName = function(){ 


    return dowhateverto(this) 

}; 

das ist, was ich bisher versucht, aber es hat nicht funktioniert. Vielleicht ist es auch eine schlechte Idee, wenn Sie mir bitte sagen könnten, warum?

wenn ja kann ich es auf einen Satz von Funktionen hinzufügen i wählen

so etwas wie:

MyFunctions.prototype.methodName = function(){ 


    return dowhateverto(this) 

}; 

wo MyFunctions ist ein Array von Funktionsnamen

danke

+0

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

+1

Die Erweiterung von integrierten JavaScript-Objekten ist eine schlechte Methode. – jerone

Antwort

25

Sicher. Funktionen sind Objekte:

var foo = function() {}; 

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

foo.bar(); 

alarmiert „bar“

+0

Dieses Code-Snippet setzt voraus, dass 'foo' zuvor deklariert wurde, andernfalls ist' foo' ein implizites globales (bad!). Vielleicht ändern Sie die Deklarationsanweisung in 'var foo = function() {};' um die gute Praxis zu verstärken ...? –

+0

Nun, es ist nicht gerade gut, den Prototyp von Stammobjekten überhaupt zu modifizieren. Aber ich stimme dir zu. – 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

Ändern JS integrierten Objekte können Sie einige Überraschungen geben.
Wenn Sie externe Bibliotheken hinzufügen oder die Version eines dieser Bibliotheken ändern, sind Sie nie sicher, dass sie Ihre Erweiterung nicht überschreiben.

+0

Ihr Link ist tot. – luckydonald

+0

@ luckydonald, danke für den Kommentar – Mic

1

Versuchen Object.prototype statt:

Object.prototype.methodName = function(){ 

    return dowhateverto(this) 
}; 

Aber auch die Warnung beachten, dass erstreckt native Objekte ist nicht immer eine gute Idee.

Function.prototype kann in Javascript nicht wirklich zuverlässig manipuliert werden; Es ist kein reales Objekt, da der Konstruktor Function() eine Funktion und kein Objekt zurückgeben muss. Aber Sie können es auch nicht wie eine normale Funktion behandeln. Sein Verhalten beim Versuch, auf seine Eigenschaften zuzugreifen, ist möglicherweise nicht definiert und variiert zwischen den Browsern. Siehe auch this question.

Verwandte Themen