Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> Funkcja i obiekt w jednym, Jeśli ktoś zna budowe np. jQuery...
Sephirus
post
Post #1





Grupa: Zarejestrowani
Postów: 1 527
Pomógł: 438
Dołączył: 28.06.2011
Skąd: Warszawa

Ostrzeżenie: (0%)
-----


Witam,

potrzebuje pomocy z JS - choć do niedawna myślałem, że znam go dobrze (IMG:style_emoticons/default/tongue.gif)

Mój cel to zrobienie obiekto-funkcji...

Znamy coś takiego z jQuery jak "$". Ma jedną fajną właściwość, którą chcę zastosować w jednym miejscu otóż można się odwoływać:

[JAVASCRIPT] pobierz, plaintext
  1. $('#jakies_id').jakas_metoda(); // <- Tutaj do $ odwołujemy się jak do funkcji
  2.  
  3. $.jakas_metoda(); // <- a tutaj jak do obiektu...
[JAVASCRIPT] pobierz, plaintext


jak to jest zrobione? Siedzę nad tym i albo to jest tak banalne, że tego nie dostrzegam, albo jest coś o czym nie wiem (IMG:style_emoticons/default/tongue.gif)

Please help (IMG:style_emoticons/default/sad.gif)

Ten post edytował Sephirus 30.11.2011, 10:18:45
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 8)
nospor
post
Post #2





Grupa: Moderatorzy
Postów: 36 561
Pomógł: 6315
Dołączył: 27.12.2004




Cytat
- poddaje sie...
Oboje wiemy, że w tytule tematu jest to totalnie zbędne. Popraw proszę.

Co do problemu:
To co opisałeś to podstawowa funkcjonalność "programowania obiektowego" w js.

Kod
function MojaKlasa(){
    return MojaKlasa;
}

MojaKlasa.metoda = function(){
    alert('bu');
}

MojaKlasa().metoda();
MojaKlasa.metoda();
Go to the top of the page
+Quote Post
Sephirus
post
Post #3





Grupa: Zarejestrowani
Postów: 1 527
Pomógł: 438
Dołączył: 28.06.2011
Skąd: Warszawa

Ostrzeżenie: (0%)
-----


Kurna rzeczywiście... :/ wiedziałem, że to coś banalnego...

kombinowałem z tworzeniem obiektu i przypisywaniem w deklaracji jego metod - nie wpadłem na to by dodać je po samej deklaracji... ehhh...

Dzięki wielkie (IMG:style_emoticons/default/wink.gif)
Go to the top of the page
+Quote Post
rasten
post
Post #4





Grupa: Zarejestrowani
Postów: 86
Pomógł: 6
Dołączył: 31.05.2010

Ostrzeżenie: (0%)
-----


Podczepię się jeśli pozwolicie, bo nie rozumiem jednej rzeczy:
  1. function MojaKlasa(){
  2. return MojaKlasa;
  3. }

Jak to działa? Mógłby ktoś mi to wytłumaczyć, bo nie czaje o co chodzi z tym returnem?

I jeszcze jedna dziwna rzecz po przetestowaniu: jeśli używamy klasy tak: MojaKlasa.metoda(); to w tym returnie możemy dać 'return BlaBla' i też działa...

Ten post edytował rasten 30.11.2011, 12:27:03
Go to the top of the page
+Quote Post
nospor
post
Post #5





Grupa: Moderatorzy
Postów: 36 561
Pomógł: 6315
Dołączył: 27.12.2004




Cytat
Jak to działa? Mógłby ktoś mi to wytłumaczyć, bo nie czaje o co chodzi z tym returnem?

W php masz np. coś takiego:
$obj->metodaobiektu()->innametodaobiektu();
a metodaobiektu ma w sobie poprostu: return $this;
Dzięki temu łancuchowo możno coś robić.

Tu w js jest niejako pokazałem podobny mechanizm.

Cytat
I jeszcze jedna dziwna rzecz po przetestowaniu: jeśli używamy klasy tak: MojaKlasa.metoda(); to w tym returnie możemy dać 'return BlaBla' i też działa...
Tak, ale nie zadziała już to:
MojaKlasa().metoda();
Go to the top of the page
+Quote Post
rasten
post
Post #6





Grupa: Zarejestrowani
Postów: 86
Pomógł: 6
Dołączył: 31.05.2010

Ostrzeżenie: (0%)
-----


@nospor, dzięki wielkie już mi się rozjaśniło, chociaż szczerze nie mogę znaleźć w internecie opisu tworzenia w ten sposób obiektu. Ale działa:)
Próbowałem w tym Twoim sposobie przed return MojaKlasa ustawić właściwości i metody klasy za pomocą this. Coś nie mogę, czyli nie da się tutaj tego tak zrobić?
Go to the top of the page
+Quote Post
nospor
post
Post #7





Grupa: Moderatorzy
Postów: 36 561
Pomógł: 6315
Dołączył: 27.12.2004




Cytat
Próbowałem w tym Twoim sposobie przed return MojaKlasa ustawić właściwości i metody klasy za pomocą this. Coś nie mogę, czyli nie da się tutaj tego tak zrobić?
zapoznaj się z podstawami "obiektówki" w js

Jest to odpowiednik metody statycznej w php
MojaKlasa.metoda = function(){

Jest to odpowiedni metody obiektu w php. Tutaj this by dzialalo, pod warunkiem ze robiles zm = new MojaKlasa()
MojaKlasa.prototype.metoda = function(){

(IMG:style_emoticons/default/smile.gif)
Go to the top of the page
+Quote Post
rasten
post
Post #8





Grupa: Zarejestrowani
Postów: 86
Pomógł: 6
Dołączył: 31.05.2010

Ostrzeżenie: (0%)
-----


Dobra już chyba rozumiem, ale jeszcze sobie coś doczytam. Dzięki (IMG:style_emoticons/default/smile.gif)
Go to the top of the page
+Quote Post
zegarek84
post
Post #9





Grupa: Zarejestrowani
Postów: 1 332
Pomógł: 294
Dołączył: 12.10.2008
Skąd: Olkusz

Ostrzeżenie: (0%)
-----


można obejść nie pisanie "new" by "this" działało w JS głównie na 2 sposoby:
Kod
function Test(a){
if(this instanceof Test){
// ustaiwamy konstruktor przy tworzeniu instancji obiektu
this.a = a;
} else {
// jeśli ktoś wywoła funkcję bez "new"
return new Test(a);
}
};

Test.prototype = {
alertA: function(){alert(this.a)}
};

Test(33).alertA();

var o = Test(33);
alert(o instanceof Test);

Kod
// DZIEDZICZENIE (no nie zupełnie tak się powinno dziedziczyć(IMG:style_emoticons/default/exclamation.gif) !) TAK COBY BEZ IFÓW I ZAPĘTLENIA

// korzystając nie poprawnie z dziedziczenia w js
function Test(a){
// obejście konstruktora - nie powinno tak się robić...
return new Test2(a);
};

Test.prototype = {
alertA: function(){alert(this.a)}
};
function Test2(a){
//faktyczny konstruktor - przy dziedziczeniu nie do końca tak się powinno robić
this.a = a;
}
Test2.prototype = Test.prototype;
Test(33).alertA();

var o = Test(33);
alert(o instanceof Test);


By w JS poprawnie dziedziczyć (chodzi o nadpisywanie i przesłanianie głównie metod) należy prototype przypisać do anonimowej funkcji i zwrócić instancję w deseń:
Kod
function instanceProto(proto){
var f=function(){};
f.prototype = proto;
return new f;
}
// i dla przykładu potem można poprawniej np.
// Test2.prototype = instanceProto(Test.prototype);


jeśli nie robiliśmy takich dziwnych "zapętleń" to wywołać konstruktora przodka u potomka można w ten sposób, że po prostu w konstruktorze wołamy konstruktora przodka bez new lub korzystamy z odpowiedniej konstrukcji funkcji call bądź apply
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
2 Użytkowników czyta ten temat (2 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 26.12.2025 - 02:59