2016-07-21 2 views
3

Ich versuche zu verstehen, den Unterschied zwischen dem Zugriff auf eine Variable über prototype vs Zugriff auf die gleiche über this. In einem Objekt scheint es eine separate Kopie von x eins für this.x und eins für *.prototype.x zu schaffen. Aber in anderen sieht beides auf dieselbe Kopie aus.Würde der Zugriff auf eine Prototypvariable 'x' über this.x eine separate Kopie erstellen?

<!DOCTYPE html> 
 
<html lang="en"> 
 
<head> 
 
    <meta charset="UTF-8"> 
 
    <title>Testing Promises</title> 
 
</head> 
 

 
<body> 
 

 
<button type="button" onclick="test()"> Click Me</button> 
 

 
<script src="http://ajax.googleapis.com/ajax/libs/jquery/2.0.0/jquery.min.js"></script> 
 
<script> 
 

 
    function Estimate() { 
 
    } 
 
    Estimate.prototype.sharedVar = 888; 
 

 

 
    Estimate.prototype.print = function() { 
 
     console.log("****************************************************"); 
 
     console.log("*  Shared Variable    : ", this.sharedVar); 
 
     console.log("*  Estimate Shared Variable : ", Estimate.prototype.sharedVar); 
 
     console.log("****************************************************"); 
 
    } 
 

 
    Estimate.prototype.update = function (value) { 
 
     this.sharedVar = value + 100; 
 
     Estimate.prototype.sharedVar = value + 300; 
 
    } 
 

 
    function test() { 
 
     var o1 = new Estimate(); 
 
     var o2 = new Estimate(); 
 
     o1.print(); 
 
     o2.print(); 
 

 
     o1.update(555); 
 

 
     o1.print(); 
 
     o2.print(); 
 

 
    } 
 

 

 
</script> 
 

 
</body> 
 

 
</html>

Warum 655, 855 in o1 während 855, 855 in o2 druckt?

Antwort

2

Wenn Sie einen Prototyp Objekte hinzufügen, wenn es alle Objekte beeinflusst mit diesem Prototyp. Wenn Sie das Schlüsselwort this verwenden, wirkt sich dies nur auf diese Instanz aus.

Die 2 Anweisungen in der folgenden Funktion sind nicht gleichwertig. Sie ändern 2 separate Variablen. Als Sie Ihre Objekte zum ersten Mal initialisiert haben, hatten sie keine Eigenschaften. Daher sucht der Interpreter, ob der Prototyp diese Eigenschaft besitzt. Wenn Sie update aufgerufen haben, wurde Ihrer Instanz eine neue Eigenschaft hinzugefügt. Wenn Sie zum ersten Mal nach this.sharedVar suchen, hat diese Instanz sie nicht, also sucht sie den Prototyp nach shared var, und wenn sie nicht gefunden wird, wird sie weiter zu SharedVar von Object gehen.

In den Vorher-Nachher-Bildern können Sie sehen, was vor sich geht.

enter image description here

enter image description here

0

Eigentlich X.prototype.Y ist nützlich, wenn Sie gleiche Eigenschaft hinzufügen möchten (hier Y) für jede Instanz von X Wenn Sie einen gemeinsamen Wert zwischen diesem Elemente möchten, dann können Sie ganz einfach eine Eigenschaft zu X selbst hinzufügen oder Sie können eine globale Variable erstellen was jedes Ding Zugang zu diesem Wert hat.

Aber wenn man es völlig versteckt aus X Objekte Umfang machen wollen, dann können Sie dies versuchen:

var X = (function _X() { 
 
    _X.SharedValue = 3; 
 
    var myFunc = function() { 
 
    _X.SharedValue++; 
 
    }; 
 

 
    myFunc.prototype.getShared =() => _X.SharedValue; 
 
    return myFunc; 
 
}()); 
 

 
console.log(new X().getShared(), new X().getShared(), new X().getShared());

Verwandte Themen