Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Funkcja i obiekt w jednym
Forum PHP.pl > Forum > Po stronie przeglądarki > JavaScript
Sephirus
Witam,

potrzebuje pomocy z JS - choć do niedawna myślałem, że znam go dobrze 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 tongue.gif

Please help sad.gif
nospor
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();
Sephirus
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 wink.gif
rasten
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...
nospor
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();
rasten
@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ć?
nospor
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(){

smile.gif
rasten
Dobra już chyba rozumiem, ale jeszcze sobie coś doczytam. Dzięki smile.gif
zegarek84
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ć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
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.