以下のコードスニペット_value
では、インスタンスで定義される集合関数を使用して45に設定しました。プロパティ_value
を使用するとすぐにインスタンスで定義されているように見えますがsetValue
、を呼び出すlogValue()
と25になります。への呼び出しのコメントを解除するとyo()
、出力は次のようになります。
25
25
45
var constructor = function() {
var _value = 25;
constructor.yo = function() {
console.log(_value);
}
constructor.prototype.logValue = function() {
console.log(_value);
}
Object.defineProperty(this, "getValue", { get: function() {return _value;}});
Object.defineProperty(this, "setValue", { set: function(input) { _value = input;}});
};
var instance = new constructor();
var instance2 = new constructor();
instance.setValue = 45;
instance.logValue();
//constructor.yo();
console.log(instance.getValue);
その_value
変数はconstructor()
関数に対してローカルです。その変数の新しいインスタンスは、constructor()
が呼び出されるたびに作成されます。これで、その関数では、呼び出されるたびyo()
に、constructor()
関数のプロパティとして関数を再作成することになります。つまり、への2回目の呼び出しconstructor()
で、「yo」プロパティの以前の値が新しい関数で上書きされます。
したがって、2番目のインスタンスオブジェクト_value
を介して変更する場合は、への2番目の呼び出しで作成されたクロージャーからその変数を変更します。「yo」プロパティは1つしかないため、呼び出されたときにログに記録される値です。_value
constructor()
3番目のインスタンスを作成する場合、同じ効果が見られます。「yo」はもう一度上書きされ、値(変更する前)は25
「yo」を介して問い合わせられたときのデフォルトに戻ります。
そのような関数で「yo」プロパティのようなプロパティを設定することは正確に間違っているわけではありませんが、この場合、それが何を達成するかは明確ではありません。コンストラクター関数自体ではなく、構築されたオブジェクトのプロパティを「yo」にする方がおそらく良いでしょう。
編集— Felix Klingは、コンストラクター内でlogValue()
プロトタイプを再定義すると、同様の(悪い)効果があることを正しく指摘しています。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加