意外的关闭行为

意外的关闭行为

问题描述:

我打算在一个框架即时通讯建设中做“扩展点”,并且我正在寻找一种方式,我可以如何为扩展提供“核心”,以便它可以添加功能但不公开它的核心对象可以任意操纵(我知道提供的接口是更好的主意),但门槛,而我是测试(以及学习),我不知道为什么发生这种情况:意外的关闭行为

(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?​​​​​​​​​​​​ 

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

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

这条线:

kit.core.bar = 'baz'; 

修改由kit.corecore引用的对象。引用不会改变,但对象确实如此。这反映在两个参考文献中。

这条线:

kit.core = null; 

修改参考kit.core引用null但不改变core,仍然引用原始对象。对象本身不会改变。

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

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

+0

另外注意'kit.core'不是一个引用或指针。这是一个值,就像本地变量'core'是一个值 – Raynos 2012-04-09 22:25:19

+0

Raynos:'kit.core'指向'core'本地对象。如果你修改对象,另一个也会改变。 – 2012-04-09 22:29:34

+0

@KarolyHorvath如果更改'kit.core'的**内容**,那么“getCore()”函数将会看到更改。但是,如果你只是把'kit.core'指向新的东西,那么(如OP所发现的),关系就会被破坏。 – Pointy 2012-04-09 22:30:54