setプロパティを使用してコンストラクター関数の実行コンテキストで定義された値を設定しても値が変更されない理由がわかりません

user6813076

以下のコードスニペット_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つしかないため、呼び出されたときにログに記録される値です。_valueconstructor()

3番目のインスタンスを作成する場合、同じ効果が見られます。「yo」はもう一度上書きされ、値(変更する前)は25「yo」を介して問い合わせられたときのデフォルトに戻ります

そのような関数で「yo」プロパティのようなプロパティを設定することは正確に間違っているわけではありませんが、この場合、それが何を達成するかは明確ではありません。コンストラクター関数自体ではなく、構築されたオブジェクトのプロパティを「yo」にする方がおそらく良いでしょう。

編集— Felix Klingは、コンストラクター内でlogValue()プロトタイプを再定義すると、同様の(悪い)効果があることを正しく指摘しています。

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

Related 関連記事

ホットタグ

アーカイブ