1

フレームワークの構築で「拡張ポイント」を実行する予定です。拡張機能に「コア」を提供して、機能を追加できるが、任意に操作できるコアオブジェクトを公開しない方法を見つけています(iインターフェイスを提供する方が良いアイデアだと知っています)が、私がテストしている間(そして学習している間)、なぜこれが起こるのか疑問に思いました:

(function() {
    var core = {'bar': 'foo'}
    function getCore() {return core;}
    window.kit = {
        core: core,
        getCore: getCore
    }
}());

//initial check
console.log(kit.core)
console.log(kit.getCore());

//change the bar
kit.core.bar = 'baz';

//we will both see 'baz'
console.log(kit.core)
console.log(kit.getCore());

//null the core
kit.core = null;

//this time...
console.log(kit.core)       //core is null on this one
console.log(kit.getCore()); //why is the core still there on this one?​​​​​​​​​​​​
4

2 に答える 2

3

オブジェクトとオブジェクト参照の違いを理解することが重要です。

最初に、同じオブジェクトcoreを参照します。kit.coreオブジェクト自体への変更は、そのオブジェクトへのすべての参照に反映されます。ただし、参照の 1 つが変更されても、他の参照は自動的に変更されません。

この行:

kit.core.bar = 'baz';

kit.coreおよびによって参照されるオブジェクトを変更しますcore。参照は変更されませんが、オブジェクトは変更されます。これは両方のリファレンスに反映されています。

この行:

kit.core = null;

参照kit.coreへの参照を変更しますが、元のオブジェクトを引き続き参照する をnull変更しません。coreオブジェクト自体は変更されません。

于 2012-04-09T22:33:51.320 に答える
2

「getCore()」関数は、「core」という名前のオブジェクト プロパティではなく、「core」という名前のローカル変数を参照しています。

"getCore()" をthis.core代わりにreturn に変更coreすると、期待どおりの結果が得られます。

于 2012-04-09T22:24:36.593 に答える