2009-07-02 9 views
9

Ich bin sicher, dass ich diese Frage falsch formuliert habe, aber ich weiß nicht, wie ich es gut erklären soll ...Kann ich Objekten in JavaScript eine öffentliche Funktion hinzufügen? Wie?

Ich habe eine vage Idee, ich habe irgendwo gelesen, dass ich Methoden zu Objekten hinzufügen kann JavaScript - mit dem meine ich so etwas wie:

function Exclaimify(aString) 
{ 
    return aString + "!"; 
} 

var greeting = "Hello"; 
alert(greeting.Exclaimify()) // this shows "Hello!" in an alert box 

Ist das möglich? Wenn ja, wie mache ich das?

+0

Zwei schnelle Kommentare: (1) Keine Notwendigkeit für den String (dies), wissen Sie "this" ist ein String, da Sie in einem String.prototype sind Funktion; (2) Fügen Sie Object.prototype oder Array.prototype nichts hinzu. Wenn Sie das tun, können Sie die Syntax "for (var item in array)" nicht mehr verwenden. –

+0

@John Kugelman: Fest, danke. – MGOwen

+0

Bitte erweitern Sie Ihre Frage nicht mit Ihrer eigenen Antwort. Wenn Sie glauben, dass eine separate Antwort notwendig ist, schreiben Sie bitte Ihre eigene Antwort unten. –

Antwort

24

Zuweisen, wie es ist eine Variable. Dann können Sie this verwenden. Einfach!

var obj = {foo: "bar"}; 

obj.someFunc = function() 
{ 
    return this.foo; 
} 

Das funktioniert super ... außer! Äh, außer, nicht an Saiten, die gegen diesen Schwachsinn immun sind. (Sie sind vollständig unveränderlich.) Es gibt jedoch einen anderen Weg, nämlich die "Klasse" des Objekts zu ändern und die Methode dort hinzuzufügen. Und mit "Klasse" meine ich wirklich "Prototyp". JavaScript doesn't have classes, it has prototypes. Die Syntax der String Prototyp zu modifizieren, sieht wie folgt aus:

var greeting = "Hello"; 

String.prototype.Exclaimify = function() 
{ 
    return this + "!"; 
} 

alert(greeting.Exclaimify()) // this shows "Hello!" in an alert box 
+0

brilliant - genau das, was ich wollte. – MGOwen

4

Es klingt, als ob Sie die Technik namens monkey patching verwenden möchten. Dieser Artikel enthält einen Link zu Duck Punching JavaScript - Metaprogramming with Prototype, der Ihnen helfen kann.

+0

Danke. Ihre verknüpften Artikel waren nicht so knapp wie die angenommene Antwort, aber immer noch genau richtig. – MGOwen

+0

Während dies theoretisch die Frage beantworten könnte, [wäre es vorzuziehen] (http://meta.stackexchange.com/q/8259), die wesentlichen Teile der Antwort hier aufzunehmen und den Link als Referenz bereitzustellen. –

Verwandte Themen