1

我计划在正在构建的框架中做“扩展点”,我正在寻找一种方法如何为扩展提供“核心”,以便它可以添加功能但不暴露可以任意操作的核心对象(我知道提供接口是更好的主意)但是,当我在测试(以及学习)时,我想知道为什么会发生这种情况:

(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

了解对象和对象引用之间的区别很重要。

一开始,corekit.core引用同一个对象。对对象本身的任何更改都将反映在对该对象的所有引用中。但是,如果其中一个参考发生更改,其他参考不会自动更改。

这一行:

kit.core.bar = 'baz';

kit.core修改和引用的对象core。引用不会改变,但对象会改变。这反映在两个参考文献中。

这一行:

kit.core = null;

修改对 referencekit.core的引用null但不更改core,它仍然引用原始对象。对象本身不会改变。

于 2012-04-09T22:33:51.320 回答
2

“getCore()”函数是指名为“core”的局部变量,而不是名为“core”的对象属性。

如果您将“getCore()”更改为返回this.core而不是返回,core那么您会看到您所期望的。

于 2012-04-09T22:24:36.593 回答