2012-04-09 5 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; 

null를 참조하는 참조 kit.core을 수정하지만 여전히 원래의 객체를 참조 core를 변경하지 않습니다. 객체 자체는 변경되지 않습니다.

2

는 "getCore는()"기능은 다음과 같습니다 내가 (물론 학습으로) 테스트 동안 임의적으로 조작 할 수있는 이런 일이 발생하는 이유, 내가 궁금해, (내가 더 나은 아이디어 인터페이스입니다 제공하는 알고)하지만 창문 "core"라는 로컬 변수를 참조하고 "core"라는 객체 속성은 참조하지 않습니다.

대신 this.core을 반환하도록 "getCore()"를 변경 한 경우 예상 한 결과가 나타납니다.

+0

'kit.core'는 참조 또는 포인터가 아닙니다. 로컬 변수'core'와 마찬가지로 값입니다. – Raynos

+0

Raynos :'kit.core'가'core' 로컬 객체를 가리키고 있습니다. 개체를 수정하면 다른 개체도 변경됩니다. –

+0

@KarolyHorvath'kit.core'의 ** 내용 **을 변경하면 "getCore()"함수가 변경 내용을 보게됩니다. 그러나,'kit.core'가 새로운 것을 참조하게 만들면, (OP가 발견되면) 관계가 깨집니다. – Pointy