2012-04-09 62 views
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?​​​​​​​​​​​​ 

回答

3

理解對象和對象引用之間的區別很重要。

開始時,corekit.core引用同一個對象。對象本身的任何更改都會反映在對該對象的所有引用中。但是,如果其中一個引用發生更改,則其他引用不會自動更改。

這條線:

kit.core.bar = 'baz'; 

修改由kit.corecore引用的對象。引用不會改變,但對象確實如此。這反映在兩個參考文獻中。

這條線:

kit.core = null; 

修改參考kit.core引用null但不改變core,仍然引用原始對象。對象本身不會改變。

2

的「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