4

私のアプリケーションでは、データを別のオブジェクトに渡すときにデータを複製しているかどうかわかりません。例として、次のコードを見てください。

var DataStore = function(data) {
    this.data = data; // <-- typeof data === 'object'
}

var Controller = function() {
    var dataStore = new DataStore({foo: 'bar'});
    var plugin = new Plugin(dataStore.data);
}

var Plugin = function(data) {
   this.data = data;
}

var app = new Controller();

プラグインを作成すると、データストアからデータプロパティが渡されます。次に、プラグイン内のプロパティに割り当てられます。渡されるデータは私の質問のオブジェクトであることを念頭に置いて、これはメモリ内に2つの変数を作成しますか、それともプラグインのデータプロパティはデータストアオブジェクトのプロパティを参照しますか?

割り当て後に参照が保持されない場合、データストアをプラグインに渡してローカルで参照を保持するにはどうすればよいですか?または、DataStoreをアプリケーションスコープのグローバル変数として保持し、プラグインからグローバルに参照する必要がありますか?

4

2 に答える 2

11

両方とも同じオブジェクトdataStore.dataplugin.data参照します-これらの「クラス」のいずれかでオブジェクトを変更すると(より適切な用語がないため)、両方のオブジェクトが変更されます(両方が同じオブジェクトへの参照を保持しているため)。

于 2012-07-17T05:25:17.723 に答える
0

関数の引数は、JSでは常に参照によって渡されます。オブジェクトを引数として渡す場合、渡されるのは実際にはメモリ内のオブジェクトの場所へのポインタです。参照自体を上書きしようとすると、元のオブジェクトには何も起こりませんが、オブジェクトのプロパティのいずれかの値を変更すると、元のオブジェクトが変更されます。

元:

function f1(_x) {
    _x = 5;
}

function f2(_y) {
    _y.name = 'Hello';
}

var x = 10;
f1(x);
console.log(x); // no change to x

var y = {name: 'Tom'};
f2(y);
console.log(y.name); // y.name is now Hello
于 2012-07-17T05:39:30.647 に答える