2016-09-07 11 views
7

Jestem nowicjuszem w JavaScript i próbuję zrozumieć niektóre z podstaw OOP i symulowanych "klas".
Po uruchomieniu ostatniej linii tego skryptu chciałbym, aby wywołany wskaźnik obiektu this na linii 4 odnosił się do obiektu farm (tak jak poprawnie robi w wierszach 2 i 3).Funkcja zmieniająca "tę" zmienną

Niestety tak nie jest i domyślam się, że wskaźnik obiektu this zamiast tego wskazuje na document.

var Building = function(cost){ 
    this.cost = cost; 
    this.printCost = function(){ 
     document.getElementById(this).innerHTML = this.cost; 
    } 
} 

var farm = new Building (50); 

farm.printCost(); 

-

<html> 
<body> 
<p id="farm"> 
</p> 
</body> 
</html> 

Czy istnieje sposób, aby uzyskać tę funkcję w użyciu właściwej obiekt? Jeśli są jakieś błędy w moim rozumieniu, proszę daj mi znać.

Nie jestem jeszcze zaznajomiony z jQuery, więc jeśli mógłbyś trzymać się głównej składni JavaScriptu, byłbym wdzięczny!

JSFiddle: https://jsfiddle.net/7n2of9k7/

+4

'getElementById (this)” nigdy pracować niezależnie –

+1

Dlaczego po prostu nie przechodzą 'farm' jako ciąg funkcjonować? – Li357

+0

Po prostu wprowadź go jako ciąg znaków: '... = function (cost, element)' gdzie element jest elementem do wstawienia. – Li357

Odpowiedz

4

O ile mi wiadomo, coraz nazwę zmiennej instancji jako ciąg jest niemożliwe. Naprawdę nie rozumiem, dlaczego zrobiłbyś to, ponieważ jest to całkiem niepraktyczne. Chciałbym po prostu przechodzą w elemencie, który ma być wprowadzony do postaci ciągu:

var Building = function(cost, element){ 
 
    this.cost = cost; 
 
    this.printCost = function(){ 
 
     document.getElementById(element).innerHTML = this.cost; 
 
    } 
 
} 
 

 
var farm = new Building(50, 'farm'); 
 

 
farm.printCost();
<p id="farm"> 
 
</p>

to teraz po prostu przekazuje identyfikator do funkcji tak wstawia poprawnie. Możesz również przekazać to do printCost.

+0

Ah, wielkie dzięki! Działa to doskonale i wyjaśnił mi wiele zamieszania! Myślę, że próbowałem zautomatyzować _too_ dużo. – Rilke

-4

Musisz przypisać to do zmiennej i używać go na swoim anonimowy

function 
    var Building = function(cost){ 
    this.cost = cost; 
    var currentObj = this; 
    this.printCost = function(){ 
     document.getElementById(this).innerHTML = currentObj.cost; 
    } 
} 

var farm = new Building (50); 

farm.printCost(); 
+2

To jest całkowicie nieprawidłowe. Dlaczego istnieje słowo kluczowe function przed deklaracją zmiennej? 'var Budynek = funkcja (koszt) {...}' jest całkowicie poprawny. – Li357

2

„TO” wewnątrz metody funkcji konstruktora zawsze oznaczać wystąpienie tej funkcji konstruktora, w przypadku To gospodarstwo == .you przechodzą całą instancję obiektu wewnątrz getElementById() method.Change metoda printCost do pobierz nazwę instancji obiektu, która jest zgodna z tym. Musisz powtórzyć przez obiekt okna, który będzie zawierał wszystkie zmienne zdefiniowane w jego zasięgu. Zatem twoim celem będzie pobranie nazwy zmiennej z obiektu okna odpowiadającego nazwie zmiennej "farm". Następnie użyj go w getElementById(). check this answer for more detail

this.printCost = function(){ 
    for(var prop in window){ 
     if(window[prop]==this){ 
      document.getElementById(prop).innerHTML = this.cost; 
     } 
    } 

} 
+0

Mam na myśli, że będzie po utworzeniu instancji ofcourse.To co op robi :) –

+0

To nie wydaje się działać: https://jsfiddle.net/u2nxxg6d/ – Li357

+0

działa dla mnie w firefox, chrome i co tam –

Powiązane problemy