function Class () {
var self = this;
this.hi = true; // this { hi: true }, self { hi: true }
self.hi = false; // this { hi: false }, self { hi: false }
}
self が通常の var のように動作しないのはなぜですか?
function Class () {
var self = this;
this.hi = true; // this { hi: true }, self { hi: true }
self.hi = false; // this { hi: false }, self { hi: false }
}
self が通常の var のように動作しないのはなぜですか?
これthis
は、(常に)プリミティブではなくオブジェクトであるためです。
オブジェクトを含む (より正確には「指している」) 変数を新しい変数に代入すると、両方の変数が同じオブジェクトを指します。これは「参照によるコピー」です。そのオブジェクトのコンテンツへの変更は、両方の変数を通じて表示されます。
プリミティブを含む変数を新しい変数に割り当てると、その値のコピーが新しい変数に割り当てられます。元の変数を変更しても、新しい変数には影響しません。
ここには特別なことは何もありませんself
。任意の 2 つの変数名で試してください。これは、ほとんどの現代言語が機能する方法です。
var x = {};
var y = x;
x.hi = true; // x { hi: true }, y { hi: true }
y.hi = false; // x { hi: false }, y { hi: false
Jack が指摘したように、ここで重要なことは、両方の変数が同じオブジェクトを参照していることです。
このような場合 (オブジェクトのコピー) に「値でコピー」する場合は、オプションがあることに注意してください。UnderscoreやLo-Dashなどの一部のライブラリには、clone
新しいオブジェクトを作成し、別のオブジェクトと同じプロパティをすべて設定するために使用できるメソッドがあります。
var y = _.clone(x);