2016-07-21 1 views
3

私はprototype経由で変数にアクセスすることと、同じものにアクセスすることの違いをthisで理解しようとしています。 1つのオブジェクトでは、this.x*.prototype.xの1つの別個のコピーを作成するように思われます(x)。しかし、他の点では、両方の点が同じコピーに見えるように見えます。このプロトタイプ変数 'x'にthis.xでアクセスすると、別のコピーが作成されますか?

<!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>

なぜそれがo2で855に対しo1 655、855、855を印刷しない ?あなたは、あなたが簡単にXに自分自身をプロパティを追加することができ、これらの要素間の共有値をしたい場合はXのすべてのインスタンスに(ここではY)同じプロパティを追加するか、グローバル変数を作成することができたときに

答えて

2

あなたはprototypeプロパティを追加

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());
が、それはすべてのオブジェクトに影響を及ぼしそのプロトタイプでthisキーワードを使用すると、そのインスタンスにのみ影響します。

以下の関数内の2つのステートメントは同等ではありません。彼らは2つの別々の変数を変更しています。最初にオブジェクトを初期化したときにはプロパティがないため、インタプリタはプロトタイプにそのプロパティがあるかどうかを調べます。 updateを呼び出すと、インスタンスに新しいプロパティが追加されました。最初にthis.sharedVarを検索すると、そのインスタンスにはそれがないので、共有varのプロトタイプを検索し、見つからなければObjectのsharedVarに移動します。

前後の画像では、何が起こっているのかを見ることができます。

enter image description here

enter image description here

0

は実際にX.prototype.Yが便利ですすべての人がその価値にアクセスできます。

しかし、あなたはそれが完全にXオブジェクトのスコープ外に隠されたようにしたいならば、あなたはこれを試すことができます。

関連する問題