2017-03-08 1 views
0

Es könnte eine sehr grundlegende Frage sein, aber ich bin so neu in Javascript, ich weiß nicht einmal, nach welchem ​​Schlüsselwort ich suchen sollte, um das zu finden. Wenn diese Frage bereits gestellt wurde, tut es mir so leid und bitte lassen Sie mich wissen, welche Frage es ist.Wie aktualisiere ich den Wert bleibt in der Schließung bei der Verwendung von Javascript?

Ich habe gelesen, dass Getter und Setter nicht am Prototyp deklariert werden können, also habe ich versucht zu testen, was passiert, wenn ich Getter und Setter im Prototyp deklariere. Aber ich hatte ein anderes Problem.

Dies ist ein einfacher Code, der einen Konstruktor deklariert, um das Objekt 'Rectangle' zu erstellen. Er enthält Getter und Setter.

Aber wenn ich diesen Code ausführen, bekomme ich '35' als Folge der Ausführung von getArea(), obwohl ich den Wert der Breite mit setWidth() auf 10 geändert habe; Ich habe den Wert der Breite auf der Konsole überprüft, aber es heißt Ihre Breite wurde auf 10 geändert.

Also ich denke, das ist etwas über Schließung, getArea() lädt Breite und Höhe, wenn es erklärt wird und es wurde nicht als aktualisiert Wert, den ich eingestellt habe.

1) Wie kann ich den Wert in getArea() aktualisieren, wenn ich den Wert von Höhe und Breite durch Setter ändere? (Wie kann ich Bereich berechnen, indem ich Funktionen mit aktualisierten Wert verwende? Selbstverständlich möchte ich es noch einkapseln. So würden Breite und Höhe nicht this.width und this.height sein)

2) Wenn mein Bauchgefühl über Schließung ist falsch, warum spuckt getArea() auf mein Gesicht?

3) Was ich zuerst ausprobieren wollte, warum kann ich Getter und Setter nicht im Prototyp deklarieren?

function Rectangle(w, h) { 
var width = w; 
var height = h; 

this.getWidth = function() { 
    return w; 
}; 
this.getHeight = function() { 
    return h; 
}; 
this.setWidth = function(w) { 
    if (w < 0) { 
     throw 'width cannot be under 0'; 
    } else { 
     console.log('width = w'); 
     width = w; 
     console.log('I put : ' + w); 
     console.log('width = ' + width); 
    } 
}; 

this.setHeight = function(h) { 
    if (h < 0) { 
     throw 'height cannot be under 0'; 
    } else { 
     console.log('height = h'); 
     height = h; 
    } 
}; 
} 
Rectangle.prototype.getArea = function() { 
    return this.getWidth() * this.getHeight(); 
}; 

var rectangle = new Rectangle(5, 7); 
rectangle.setWidth(10); 

alert('AREA : ' + rectangle.getArea()); 

Antwort

1

Sie müssen zurückkehren ‚Breite‘ anstelle von ‚w‘ . Hier habe ich geändert Sie diesen Code überprüfen,

 this.getWidth = function() { 
      return width; 
     }; 
     this.getHeight = function() { 
      return height; 
     }; 

function Rectangle(w, h) { 
 
      var width = w; 
 
      var height = h; 
 

 
      this.getWidth = function() { 
 
       return width; 
 
      }; 
 
      this.getHeight = function() { 
 
       return height; 
 
      }; 
 
      this.setWidth = function (w) { 
 
       if (w < 0) { 
 
        throw 'width cannot be under 0'; 
 
       } else { 
 
        console.log('width = w'); 
 
        width = w; 
 
        console.log('I put : ' + w); 
 
        console.log('width = ' + width); 
 
       } 
 
      }; 
 

 
      this.setHeight = function (h) { 
 
       if (h < 0) { 
 
        throw 'height cannot be under 0'; 
 
       } else { 
 
        console.log('height = h'); 
 
        height = h; 
 
       } 
 
      }; 
 
     } 
 
     Rectangle.prototype.getArea = function() { 
 
      return this.getWidth() * this.getHeight(); 
 
     }; 
 

 
     var rectangle = new Rectangle(5, 7); 
 
     rectangle.setWidth(10); 
 

 
     alert('AREA : ' + rectangle.getArea());

0

Ihre Getter kehren die w und h Sie haben in geben, statt der lokalen Schließung width und height Variablen. Sie setzen diese width und height in Ihren Setter, aber die ursprünglichen w und h bleiben ihre Anfangswerte und werden als solche in Ihren Gettern zurückgegeben.

Versuchen Sie zwei Getter Funktionen Aktualisierung Ihres width und height zurück, wenn Sie wollen, um die aktualisierten Werte zurückgeben Sie in Ihrem Setter verwenden:

this.getWidth = function() { 
    return width; 
}; 
this.getHeight = function() { 
    return height ; 
}; 
+0

...! Ich sollte den Autor meines Javascript-Buchs wissen lassen, dass es einen Fehldruck auf seinem Buch gab. Nach dem Ändern der Getter funktioniert alles. Vielen Dank! – HyeonWoo

+0

@HyeonWoo froh zu helfen. Vergessen Sie nicht, als beantwortet zu markieren, wenn dies Ihr Problem behebt! – rgthree

+0

Entschuldigung, wo kann ich den Knopf finden, der als beantwortet markiert wird? Ich bin total neu hier – HyeonWoo

Verwandte Themen