Reputation: 119847
I plan to do "extension points" in a framework im building and i'm finding a way how i can provide the "core" to an extension so it can add functionality but not exposing the core object that it can be arbitrarily manipulated (i know providing an interface is the better idea) but sill, while i was testing (as well as learning), i wondered why this happens:
(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?
Upvotes: 1
Views: 67
Reputation: 44326
It's important to understand the difference between an object and an object reference.
At the beginning, core
and kit.core
reference the same object. Any changes to the object itself will reflect in all references to that object. However, if one of the references is changed, the other references are not automatically changed.
This line:
kit.core.bar = 'baz';
modifies the object referenced by kit.core
and core
. The references do not change, but the object does. This is reflected in both references.
This line:
kit.core = null;
modifies the reference kit.core
to reference null
but does not change core
, which still references the original object. The object itself does not change.
Upvotes: 3
Reputation: 413737
The "getCore()" function is referring to the local variable named "core", not the object property named "core".
If you changed "getCore()" to return this.core
instead of just core
then you'd see what you expected.
Upvotes: 2