2009-10-13 13 views
6

jest sposób na określenie, która klasa jest funkcją? Przykład:JavaScript - pobierz klasę funkcji (metody)

function globalFunc(){ 
//alert MyObject 
} 

function MyObject(){ 
} 
MyObject.prototype.test=function(){ 
globalFunc(); 
} 

var o=new MyObject(); 
o.test(); //alert MyObject 

teraz im korzystania z tego rozwiązania:

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 

Ale nie jest to duży problem, wyglądają następująco:

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 

Tak, istnieje wyraźny sposób, aby uzyskać to ? Wiem, gdzie jest problem (klasa właściwość jest właściwością tylko testu, a nie temperatury), ale nie mogę dodać klasy do temp. Też.

Dzięki.


Dzięki za odpowiedź, trochę wyjaśnienia.

Próbuję zrobić osobistą ramkę OO skierowaną do członków prywatnych.

Więc:

globalFunc jest specjalną funkcją, im go używać, aby dostać „prywatny” własność i nie mogę nazwać metodą połączenia lub przechodząc jakieś argumenty, jedyne argumenty im pass jest "to":

przykład, $() jest globalnym

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 

do prac z dziedziczenia, $(), muszę wiedzieć, co to klasa i obiekt klasy zadzwonić.

Wszystko działa dobrze, ale jeśli trzeba uzyskać dostęp do prywatnych użytkowników w clousure muszę dodać __class__ właściwość Clouser !! I nie chcę tego!

Jeszcze raz dziękuję i przepraszam za mój zły angielski, nie jestem native speakerem.

+0

Będziesz musiał oduczyć się idei, że istnieje coś takiego jak "klasa" w JavaScript. Nie ma. –

Odpowiedz

0

temp jest osobą dzwoniącą, ale nie ma właściwości __class__. Zdefiniowałeś to tylko dla test.

+0

Tak ... proszę, pytaj tutaj, czy ktoś zna inne rozwiązanie. –

+0

ps. Nie mogę też dodać właściwości __class__ do temp. –

0

caller jest niestandaryzowana i naprawdę krucha; najlepiej unikać. Znacznie lepiej jest przekazać wartość extenso:

MyObject.prototype.test= function() { 
    element.addEventListener('click', function() { 
     globalFunc(MyObject); 
    }); 
}; 

czyli

MyObject.prototype.test= function() { 
    var myclass= arguments.callee.__class__; 
    element.addEventListener('click', function() { 
     globalFunc(myclass); 
    }); 
}; 
2

Ty scenariusz nie jest do końca jasne, ale oto kilka opcji: -

function globalFunc() 
{ 
    alert(this.__class__); 
    //Note globalFunc now has access to much more. 
} 

function MyObject(){ } 
MyObject.prototype.test=function(){ 
    globalFunc.call(this); 
} 
MyObject.prototype.__class__=MyObject; 

Aby dodać zamknięcie na imprezy obsługa

MyObject.prototype.test = function(){ 
    var self = this; 
    var elem = //get some element; 
    //Not cross-browser but for illustration 
    elem.addEventListener('click', fnEvent); 
    function fnEvent() { globalFunc.call(self); } 
    elem = null 
} 
3

W javascript nie ma klas. Zamiast tego kilka obiektów może "posiadać" tę samą funkcję.Na przykład:

function myFun(){ 
    alert(this.name); 
} 

function Obj1(){ 
    this.name = "obj1"; 
} 
Obj1.prototype.fun = myFun; 

function Obj2(){ 
    this.name = "obj2"; 
} 
Obj2.prototype.fun = myFun; 
var obj1 = new Obj1(); 
var obj2 = new Obj2(); 
obj1.fun(); 
obj2.fun(); 
+2

Co z ES6? – CoDEmanX

+0

Klasy @CoDEmanX ES6 to po prostu cukier składniowy. Definiowanie metody w klasie jest takie samo jak ustawienie metody na prototypie konstruktora – Marius

0

Funkcje nie są "własnością" w JavaScript. Funkcje są pierwszymi obiektami klasy w JavaScript, co oznacza, że ​​mogą być przekazywane jak każda inna zmienna i przypisywane jako właściwości wielu obiektów.

this wewnątrz ciała funkcji daje odniesienie do obiektu, w których funkcja została wywołana, jeśli nazywa się metodą (np myObj.myMethod()) lub z prototypem Function call() lub apply() metod (np myFunc.call(myObj)). Wewnątrz funkcji wywoływanej samodzielnie (np. myFunc()), this będzie zwykle obiektem globalnym (takim samym jak window w większości przeglądarek).

1

Nie rozumiem dobrze, co próbujesz zrobić, ale oto pomysł, który może cię zainspirować.
Właściwość "constructor" pomogła mi dobrze, gdy próbowałem używać JS jako języka OO.

o.constructor poda numer referencyjny funkcji myObject.

Ale moim zdaniem, należy podać Programowanie funkcyjne spróbować zamiast OO, aby uzyskać jak najwięcej z JavaScript

0

krótka odpowiedź, tak naprawdę nie ma sposobu, aby robić to, co staramy się robić. JavaScript po prostu nie działa w ten sposób.

Długa odpowiedź ...

Niemal każdy programista Poznałem który przyszedł do JavaScript z języka, który wykorzystuje klasyczny model obiektowy starał się robić to, co robisz: emulować klasycznego stylu OOP są one używany z Javascriptem. Nie ma w tym wstydu, zrobiłem to, nawet słynny Douglas Crockford eksperymentował z tym, a później zrezygnował. Ja też. Wciąż myślę, że to było dla mnie niezbędne, aby wypróbować te rzeczy, aby naprawdę nauczyć się języka. Nie daj się zwieść kędzierzawym szelkom i znajomym operatorom. W swoim rdzeniu ma bardzo niewiele wspólnego z Javą! JavaScript jest językiem funkcjonalnym: funkcje same w sobie są obiektami.

wprost: Nie ma sposobu, aby robić to, co staramy się robić - posiada obiekty z prywatnych posesji można uzyskać dostęp poprzez to

Mówiąc, że jest łatwe :) Zrozumienie sposobu stosowania, które jest trudniejsze

Nie ma klas, są tylko obiekty. Obiekty mają tylko właściwości. Właściwości obiektów mogą mieć wartości. Te wartości mogą być funkcjami. Ten jest ustawiany, gdy wywoływana jest funkcja, może to być dowolne zdarzenie:

Zamknięcie to jedyny sposób na uzyskanie prawdziwej prywatności w JavaScript. Wszystko inne może przeniknąć do jakiegoś ograniczającego zakresu, opiera się na zaciemnionych nazwach właściwości lub może być w jakiś sposób obchodzone przez osobę dzwoniącą, lub przecieka pamięć nawet po tym, jak twoje obiekty nie są już przywoływane (ponieważ nie ma funkcji destruktora do czyszczenia w).

Co robisz jest nadal dobrą rzeczą, aby spróbować zrobić, próbując go staniesz się lepszym JavaScript programista przez zastanawianie się: dlaczego nie można zrobić niektóre z nich ważniejsze, dlaczego pewnie powinnam” t