意外的关闭行为
问题描述:
我打算在一个框架即时通讯建设中做“扩展点”,并且我正在寻找一种方式,我可以如何为扩展提供“核心”,以便它可以添加功能但不公开它的核心对象可以任意操纵(我知道提供的接口是更好的主意),但门槛,而我是测试(以及学习),我不知道为什么发生这种情况:意外的关闭行为
(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?
答
理解对象和对象引用之间的区别很重要。
开始时,core
和kit.core
引用同一个对象。对象本身的任何更改都会反映在对该对象的所有引用中。但是,如果其中一个引用发生更改,则其他引用不会自动更改。
这条线:
kit.core.bar = 'baz';
修改由kit.core
和core
引用的对象。引用不会改变,但对象确实如此。这反映在两个参考文献中。
这条线:
kit.core = null;
修改参考kit.core
引用null
但不改变core
,仍然引用原始对象。对象本身不会改变。
答
的“getCore()”功能指的是名为“core”的局部变量,而不是名为“core”的对象属性。
如果您更改了“getCore()”返回this.core
而不是core
,那么您会看到您的预期。
另外注意'kit.core'不是一个引用或指针。这是一个值,就像本地变量'core'是一个值 – Raynos 2012-04-09 22:25:19
Raynos:'kit.core'指向'core'本地对象。如果你修改对象,另一个也会改变。 – 2012-04-09 22:29:34
@KarolyHorvath如果更改'kit.core'的**内容**,那么“getCore()”函数将会看到更改。但是,如果你只是把'kit.core'指向新的东西,那么(如OP所发现的),关系就会被破坏。 – Pointy 2012-04-09 22:30:54