2012-09-29 18 views
8

Wir können ein DOM-Element modifizieren und zu seinem Prototyp hinzufügen. Zum Beispiel, wenn wir etwas nur auf die Leinwand hinzufügen möchten, würden wir so etwas tun:Funktionen an einer Instanz eines Elements anhängen

HTMLCanvasElement.prototype.doSomething = function(arg) { ... }; 

Wir können dann diese Aktion ausführen auf einem Canvas-Element:

var canvas = document.getElementById('canvasId'); 
canvas.doSomething(...); 

Ist es Es ist möglich, dieser Instanz der Zeichenfläche eine Funktion hinzuzufügen/anzuhängen, ohne den Prototyp von HTMLcanvasElement zu ändern. Ich möchte nur eine Arbeitsfläche, auf der doSomething (...) aufgerufen wurde, um auf die zusätzlichen Methoden zugreifen zu können, nicht auf alle Canvas-Elemente im DOM. Wie kann ich das machen?

Ich habe folgendes in meiner doSomething Funktion versucht:

this.prototype.foobar = function() {...} 

jedoch Prototyp ist hier nicht definiert.

Antwort

5

Shusl half mir mit der richtigen Antwort zu kommen. Es war einfacher als ich dachte. In meiner doSomething (args) -Funktion habe ich die Funktion direkt angefügt, anstatt den Objektprototyp zu ändern. Hier ist die vollständige Quellcode:

HTMLCanvasElement.prototype.doSomething = function(args) { 
    this.foobar = function(args) { ... }; 
} 

var canvas = document.getElementById('canvasId'); 
canvas.doSomething(...); 
canvas.foobar(...); 

Nun foobar ist nur für die Instanz der Leinwand, wo doSomething genannt wurde. Gleichzeitig muss ich keine Informationen über die Instanz haben.

+1

Auf diese Weise können alle Instanzen foobar haben, wenn sie doSomething aufrufen. – Anoop

+2

Möglicherweise möchten Sie einen Haken hinzufügen, um zu sehen, ob 'this.foobar' bereits vorhanden ist, bevor Sie es setzen. Auf diese Weise wird jedes Mal, wenn sie 'doSomething' aufrufen,' this.foobar' nicht zurückgesetzt. – Ian

+0

Ah ja, danke! – Sai

4

In diesem Fall können Sie direkt

var canvas = document.getElementById('canvasId'); 
canvas.doSomething= function() {...}; ///doSomething will only be available to this particular canvas. 
canvas.doSomething(...); 
+0

doSomething funktioniert gut. Ich möchte in der Lage sein, eine andere Methode/Funktion anzuhängen. Ich werde jedoch nicht unbedingt wissen, an welches Objekt ich angehefte. Ich habe keinen Zugriff auf das "Canvas" -Objekt. – Sai

+0

Obwohl Ihre Antwort nicht korrekt war, aber Ihre Antwort hat mir geholfen, die Antwort zu bekommen. Abgestimmt! – Sai

+0

Sie können einen Bezeichner an das Canvas-Objekt anhängen oder die Referenz für einen bestimmten Canvas beibehalten. Und Zugriff auf diese Leinwand, wann immer Sie wollen. Sie können eine beliebige Anzahl von Methoden an ein Objekt anhängen. – Anoop

2

Mit jQuery ein method auf der Leinwand Objekt einhängen können Sie die data Eigenschaft verwenden.

//setting the function 
$('element').data('doSomething', function(arg) { ... }); 
//calling the function 
$('element').data('doSomething')(arg); 

JSFiddle

Verwandte Themen