2
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 のように動作しないのはなぜですか?

4

2 に答える 2

5

これthisは、(常に)プリミティブではなくオブジェクトであるためです。

オブジェクトを含む (より正確には「指している」) 変数を新しい変数に代入すると、両方の変数が同じオブジェクトを指します。これは「参照によるコピー」です。そのオブジェクトのコンテンツへの変更は、両方の変数を通じて表示されます。

プリミティブを含む変数を新しい変数に割り当てると、その値のコピーが新しい変数に割り当てられます。元の変数を変更しても、新しい変数には影響しません。

于 2013-05-22T13:18:28.250 に答える
1

ここには特別なことは何もありません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 が指摘したように、ここで重要なことは、両方の変数が同じオブジェクトを参照していることです。

このような場合 (オブジェクトのコピー) に「値でコピー」する場合は、オプションがあることに注意してください。UnderscoreLo-Dashなどの一部のライブラリには、clone新しいオブジェクトを作成し、別のオブジェクトと同じプロパティをすべて設定するために使用できるメソッドがあります。

var y = _.clone(x);
于 2013-05-22T13:18:44.793 に答える