Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Dodanie obiektu do obiektu poprzez prototype.
Forum PHP.pl > Forum > Po stronie przeglądarki > JavaScript
adbacz
Niezbyt wiem jak to sie dokładnie nazywa, ale chodzi mi o poniższy kod.

[JAVASCRIPT] pobierz, plaintext
  1. var Main = function(data) {
  2. this.someData = data;
  3.  
  4. this.doSomethig = function() {
  5. var subObj = new Main.SubObject;
  6. };
  7. };
  8.  
  9. Main.prototype.SubObject = function() {
  10. this.someMethod = function() {
  11.  
  12. }
  13. };
  14.  
  15. // Wywołanie
  16. var app = new Main({ /* data */ });
  17. app.doSomethig();
[JAVASCRIPT] pobierz, plaintext


Niestety, w ostatniej linijce powyższego kodu wykrzacza mi się i pisze, że SubObject jest undefined. Mam nadzięję, że rozumiecie o co mi chodzi - jak to osiągnąć?
PrinceOfPersia
brakuje new:
Cytat
var app = Main({ /* data */ });


przerobisz na tak:
Cytat
var app = new Main({ /* data */ });

to powinno być dobrze.

new automatycznie tworzy nowy obiekt i funkcja Main może się do niego odwoływać poprzez this. Teraz żadnego obiektu nie tworzysz.

Chociaż... Jakbyś chciał żeby funkcja Main tworzyła obiekt, a nie chciałbyś używać operatora new, to byś mógł to osiągnąć, ale byś musiał przepisać funkcję Main w ten sposób mniej więcej:

[JAVASCRIPT] pobierz, plaintext
  1. var Main = function(data) {
  2. var self = {};
  3. self.someData = data;
  4.  
  5. self.doSomethig = function() {
  6. var subObj = new Main.SubObject;
  7. };
  8. return self;
  9. };
[JAVASCRIPT] pobierz, plaintext


PS. aha, no i po angielsku "coś" się pisze something, a nie somethig.
adbacz
Wkradł się mały błąd, używam operatora "new", ale tutaj zapomniałem go dodać. Podaję link do JSFiddle z kodem: https://jsfiddle.net/agoLzx0f/
PrinceOfPersia
po pierwsze. Nie
[JAVASCRIPT] pobierz, plaintext
  1. new Main.SubObject;
[JAVASCRIPT] pobierz, plaintext

tylko
[JAVASCRIPT] pobierz, plaintext
  1. (new Main).SubObject;
[JAVASCRIPT] pobierz, plaintext


(nie pytaj mnie, sam się zdziwiłem, że tak nie działa. Ale widać kolejność operatorów new i operatora kropki jest taka, że trzeba nawiasów).

po drugie jeśli piszesz tak:

[JAVASCRIPT] pobierz, plaintext
  1. Main.prototype.SubObject = function() {
  2. this.someMethod = function() {
  3. alert('asd');
  4. };
  5. };
[JAVASCRIPT] pobierz, plaintext

to SubObject jest konstruktorem, który korzysta z this, więc tak samo trzeba new przed nim:
[JAVASCRIPT] pobierz, plaintext
  1. var subObj = new (new Main).SubObject;
[JAVASCRIPT] pobierz, plaintext

(co nie wygląda dobrze pod kątem kodu, ale biorąc pod uwagę sposób w jaki stworzyłeś te obiekty - działa.)
https://jsfiddle.net/agoLzx0f/1/
adbacz
Dziekuję, faktycznie, teraz działa.

Nie sądziłem, że będzie trzeba wrzucać w nawiasy i tworzyć tak jakby dwa obiekty. Zastanawiam sie jak programiści JS robią na przykład poniższy kod:
[JAVASCRIPT] pobierz, plaintext
  1. var o1 = new Main();
  2. var o2 = new Main.Sub();
[JAVASCRIPT] pobierz, plaintext
Comandeer
Należy rozróżnić w JS własności statyczne "klasy" od własności poszczególnych instancji. W Twoim kodzie konieczne jest zastosowanie dziwacznej konstrukcji z nawiasami, ponieważ SubObject umieściłeś w prototypie Main. Tym samym SubObject staje się dostępny jedynie z poziomu konkretnych instancji "klasy" Main.

To, co chcesz uzyskać, jest możliwe do osiągnięcia w JS dzięki temu, że w tym języku wszystko jest obiektem - w tym funkcje. Tym sposobem można zadeklarować SubObject jako metodą statyczną:
Kod
Main.SubObject = function()
{

}

Wówczas bez problemu można to wywołać jako
Kod
var sub = new Main.SubObject();

Ot, takie public static w JS wink.gif
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.