2012-04-09 9 views
1

Je prévois de faire des "points d'extension" dans un framework im building et je trouve un moyen de fournir le "core" à une extension afin qu'elle puisse ajouter des fonctionnalités sans exposer l'objet de base peut être arbitrairement manipulé (je sais créer une interface est la meilleure idée) mais de seuil, alors que je testais (ainsi que l'apprentissage), je me suis demandé pourquoi cela se produit:Comportement de fermeture inattendu

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

Répondre

3

Il est important de comprendre la différence entre un objet et une référence d'objet. Au début, core et kit.core font référence au même objet. Toute modification de l'objet reflétera dans toutes les références à cet objet. Cependant, si l'une des références est modifiée, les autres références ne sont pas automatiquement modifiées.

Cette ligne:

kit.core.bar = 'baz'; 

modifie l'objet référencé par kit.core et core. Les références ne changent pas, mais l'objet le fait. Ceci est reflété dans les deux références.

Cette ligne:

kit.core = null; 

modifie la référence kit.core de référence null mais ne change pas core, qui fait référence encore l'objet d'origine. L'objet lui-même ne change pas.

2

la fonction « getCore() » est se référant à la variable locale nommée "core", pas la propriété de l'objet nommé "core".

Si vous avez changé "getCore()" pour retourner this.core au lieu de seulement core alors vous verriez ce que vous attendiez.

+0

Notez également que 'kit.core' n'est pas une référence ou un pointeur. C'est une valeur, tout comme la variable locale 'core' est une valeur – Raynos

+0

Raynos:' kit.core' pointe vers l'objet local 'core'. si vous modifiez l'objet, l'autre changera aussi. –

+0

@KarolyHorvath Si vous changez le ** contenu ** de 'kit.core', alors la fonction" getCore() "verra le changement. Si, cependant, vous faites juste 'kit.core' référez-vous à quelque chose de nouveau, alors (comme l'OP a découvert) la relation est cassée. – Pointy