2016-09-07 7 views
7

Ich bin neu in JavaScript und versuche, einige der Grundlagen von OOP und simulierten "Klassen" zu verstehen.

Nach Ausführung der letzten Zeile dieses Skripts möchte ich den aufgerufenen this Objektzeiger in Zeile 4 auf das farm Objekt verweisen (genau wie es richtig in Zeile 2 und 3 tut).Funktion ändert die Variable "this"

Leider tut es nicht, und ich würde vermuten, dass der this Objektzeiger stattdessen in Richtung document zeigt.

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> 

Gibt es eine Möglichkeit, diese Funktion zu erhalten richtiges Objekt zu benutzen? Wenn Sie Verständnisfehler haben, lassen Sie es mich bitte wissen.

Ich bin noch nicht vertraut mit jQuery also, wenn Sie Kern-JavaScript-Syntax bleiben könnte, würde ich es zu schätzen wissen!

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

+4

'getElementById (this)‘ funktionieren würde nie –

+1

unabhängig Warum nicht einfach 'Zuchtbetrieb als String übergeben funktionieren? – Li357

+0

Übergeben Sie es einfach als String: '... = Funktion (Kosten, Element)' wo Element ist das Element in einfügen. – Li357

Antwort

4

Soweit ich weiß, gibt es die Variablennamen der Instanz als String unmöglich ist. Ich sehe auch nicht wirklich, warum du das machen würdest, weil es ziemlich unpraktisch ist. Ich würde passieren nur in dem Element, das Sie in als Zeichenfolge eingefügt werden soll:

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>

Das jetzt nur eine ID in die Funktion übergeben wird, damit es richtig einsetzt. Sie können dies auch an printCost weitergeben.

+0

Ah, vielen Dank! Das funktioniert perfekt und hat für mich viel Verwirrung aufgewischt! Ich glaube, ich habe versucht, vieles zu automatisieren. – Rilke

-4

Sie haben dies Variablen zuzuweisen, und verwenden Sie es auf Ihrem anonymen

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

Dies ist vollständig ungültig. Warum gibt es vor einer Variablendeklaration ein Funktionsschlüsselwort? 'var Gebäude = Funktion (Kosten) {...}' ist vollkommen gültig. – Li357

2

„THIS“ innerhalb einer Methode der Konstruktorfunktion zeigen immer die Instanz dieser Konstruktorfunktion, in Ihrem Fall diese == Farm .Sie sind vorbei die gesamte Objektinstanz innerhalb getElementById() method.Change Ihre printCost Methode Holen Sie sich den Namen der Objektinstanz, die dieser entspricht. Sie müssen iterieren über Fensterobjekt, das alle Variablen in seinem Bereich definiert haben wird. Ihr Objekt wird also sein, den Variablennamen vom Fensterobjekt zu erhalten, das mit dem Namen des Variablennamens "farm" übereinstimmt. Dann verwenden Sie es in 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

Ich meine, es wird nach dem Erstellen der Instanz ofcourse.That, was op tut :) –

+0

Dies scheint nicht zu funktionieren: https://jsfiddle.net/u2nxxg6d/ – Li357

+0

funktioniert für mich in Firefox, Chrom und was nicht –

Verwandte Themen