Javascript - get-Klasse-Inhaber einer Funktion(Methode)
gibt es eine Möglichkeit zu wissen, welche Klasse eigene Funktion?
Beispiel:
function globalFunc(){
//alert MyObject
}
function MyObject(){
}
MyObject.prototype.test=function(){
globalFunc();
}
var o=new MyObject();
o.test(); //alert MyObject
Bin jetzt mit diesem workaround:
function globalFunc(){
alert(globalFunc.caller.__class__);
}
function MyObject(){
}
MyObject.prototype.test=function(){
globalFunc();
}
MyObject.prototype.test.__class__=MyObject;
var o=new MyObject();
o.test(); //alert MyObject
Aber es ist ein großes problem, diese freuen:
function globalFunc(){
alert(globalFunc.caller.__class__);
}
function MyObject(){
}
MyObject.prototype.test=function(){
var temp=function(){
globalFunc();
}
temp();
/* to simulate a simple closure, this may be for example:
element.addEventListener("click",temp,false);
*/
}
MyObject.prototype.test.__class__=MyObject;
var o=new MyObject();
o.test(); //alert undefined
So, es gibt einen klaren Weg, um diese zu erhalten?
Ich weiß, wo ist das problem(Klasse - Eigenschaft ist eine Eigenschaft, die nur testen und nicht zu warm), aber ich kann nicht hinzufügen Klasse auf temp zu.
Dank.
Danke für die Antwort, einige Klarstellungen.
Ich versuche zu tun, eine persönliche framwork OO orientiert sich mit privaten Mitgliedern.
Also:
globalFunc ist eine Besondere Funktion, die im mit Sie es um "privates" Eigentum, und ich kann nicht rufen Sie es mit call-Methode oder der übergabe der Argumente, die nur Argumente im pass ist "das":
Beispiel, $() ist global
Class({
public:{
MyClass:function(){
},
setName:function(name) {
$(this).name=name; //set the private var name
},
getName:function(){
return $(this).name;
}
},
private:{
name:"UNKNOWN"
}
})
var o=new MyClass();
o.getName(); //UNKNOWN
o.setName("TEST!!!");
o.getName(); //TEST!!!
o.name; //undefined
$(o).name; //undefined
Werke mit Vererbung, $(), muss ich wissen, was Klasse aufrufen und das Objekt der Klasse.
Alles funktioniert gut, aber wenn ich brauche, um Zugang zu einer privaten Mitglieder in einer clousure muss ich hinzufügen
__Klasse__
Eigenschaft clouser!! Und ich nicht will das!
Nochmals vielen Dank und sorry für mein schlechtes Englisch, ich bin nicht Muttersprache.
- Sie müssen verlernen, die Idee, dass es so etwas wie eine "Klasse" in JavaScript. Gibt ' s dazu nicht.
Du musst angemeldet sein, um einen Kommentar abzugeben.
In javascript gibt es keine Klassen. Anstatt mehrere Objekte können die "eigenen" der gleichen Funktion. Zum Beispiel:
Sie Szenario ist nicht ganz klar, aber hier sind einige Möglichkeiten:-
Hinzufügen einer Schließung für das event-handling
Ich nicht gut verstehen, was Sie versuchen zu tun, aber hier ist eine Idee, die inspirieren konnte, dir etwas.
Die "constructor" - Eigenschaft hat mir geholfen, auch wenn ich versuche zu verwenden JS als OO-Sprache.
o.constructor
geben Sie diemyObject
Funktion Verweis.Aber meiner Meinung nach, sollte man die funktionale Programmierung ein versuchen, statt der OO bekommen die die meisten von Javascript
temp
ist der Anrufer aber nicht die Eigenschaft haben__class__
. Sie nur definiert, dass fürtest
.caller
ist nicht standardisiert und wirklich spröde; am besten vermieden werden. Viel besser, übergeben Sie den Wert explizit:oder:
Funktionen sind nicht "Besitz" in JavaScript. Funktionen sind first-class Objekte in JavaScript, das heißt, Sie können übergeben werden, um wie jede andere variable zugeordnet und als Eigenschaften von vielen Objekten.
this
innerhalb einer Funktion Körper wird es Ihnen mit einem Verweis auf das Objekt, auf dem die Funktion aufgerufen wurde, wenn genannt, wie eine Methode (z.B.myObj.myMethod()
) oder über die Funktion Prototypcall()
oderapply()
Methoden (z.B.myFunc.call(myObj)
). Innerhalb einer Funktion aufgerufen (z.B.myFunc()
),this
wird in der Regel das Globale Objekt (das gleiche wiewindow
in den meisten Browsern).Kurze Antwort, es gibt wirklich keinen Weg, das zu tun, was Sie versuchen zu tun. Javascript funktioniert einfach nicht so.
Lange Antwort...
Fast jeder Programmierer, die ich getroffen habe, der gekommen ist, um die JavaScript-Sprache, die verwendet einen klassischen Objekt-Modell versucht hat, das zu tun, was Sie tun: emulieren die klassische OOP-Stil, die Sie verwendet werden, um mit Javascript.
Es ist keine Schande hier, ich Tat dies, auch die berühmte Douglas Crockford experimentierte mit diesem und dann später gab es auf. Ich Tat es auch. Ich denke immer noch, es war eine notwendige Sache für mich, um zu versuchen, dieses Zeug, um wirklich lernen die langauage
Lasst Euch nicht täuschen durch die geschweiften Klammern, und vertraut auf der Suche Betreiber. Im Kern hat es sehr wenig mit Java! JavaScript ist eine funktionale Sprache: Funktionen sind Objekte in Ihrem eigenen Recht.
Klar zu sagen: Es gibt keine Möglichkeit, das zu tun, was Sie versuchen zu tun - Objekte mit privaten Eigenschaften, auf die Sie zugreifen können, durch diese
Sagen, dass ist ganz einfach 🙂 das Verständnis, wie sich zu bewerben ist dies schwieriger
Gibt es keine Klassen gibt es nur Objekte.
Nur Objekte haben Eigenschaften.
Eigenschaften von Objekten können Werte haben.
Diese Werte können sein Funktionen.
diese wird gesetzt, wenn die Funktion aufgerufen wird, es könnte alles sein
Verschluss ist nur so erreichen Sie echte Privatsphäre in JavaScript. Alles andere entweder Lecks in einige umschließenden Rahmen, stützt sich auf die verborgenen Namen der Eigenschaft, oder kann umgangen werden, in irgendeiner Weise durch den Anrufer, oder verliert Speicher, auch nachdem Sie Ihre Objekte nicht mehr verwiesen wird (denn es gibt keine Destruktor-Funktion, um Ihre clean-up).
Was Sie tun, ist immer noch eine gute Sache, zu versuchen und zu tun, indem Sie versuchen es, werden Sie eine bessere JavaScript-Programmierer, indem Sie herauszufinden:
warum können Sie nicht tun, es
noch wichtiger ist, warum Sie wahrscheinlich sollte nicht