2012-12-19 3 views
5
function modify(val, newVal) { 
    val = newVal; 
} 
constructorFunc = function() { 
    var _private = false; 

    return { 
     modifyPrivate: function(toVal) { 
      return modify(_private, toVal); // LINE REFERRED TO BELOW AS X 
     } 
    }; 
} 
var x = constructorFunc(); 
x.modifyPrivate(true); 
x.modifyPrivate(true); // _private still starts off as false, meaning it wasn't set to true 

내가 가지고있는 질문 중 하나는 x.modifyPrivate (true)를 두 번째로 호출하는 이유입니다. 왜 X 선을 실행하면 전달 된 _private의 값이 여전히 '거짓'입니까?모듈 패턴의 개인 멤버, 변경할 수 없습니까?

클로저에 대한 지식을 약간 변경하면 클로저가 참조로 처리되고 참조의 값을 변경하면 원래 참조가 가리키는 값을 변경하지 않으면이 사실을 이해할 수 있습니다. 어떤 새로운 가치를 가리 키도록 참조 자체를 바꾸고 있습니다 ...하지만이 모든 일은 매우 혼란스럽고 누군가가 저를 설명하는 그물에서 다이어그램을 가리킬 수 있다고 확신합니다.

또한이 코드를 작성하여 _private가 사실 modify() 호출을 위해 수정되도록하는 방법을 알고 싶습니다.

+4

인수가 값으로 전달됩니다. JS. 이는'modify' 함수가 효율적으로 의미가 없음을 의미합니다. 객체에 참조 된 값이 'val'이라도 _local_ copy (= 참조) 값은 객체 자체가 아니라 다시 작성됩니다. – raina77ow

+0

예, 고맙습니다, 나는 그것을 잊어 버린 것을 믿을 수 없습니다. 클로저는 참조를 사용하고, 함수 호출은 값을 사용합니다. 권리! – JayPrime2012

답변

3

JavaScript는 항상 값을 전달하므로 함수에 변수를 전달하고 함수가 새 값을 할당하도록 할 수 없습니다.

실제로는 modify 기능이 전혀 필요하지 않습니다. 그냥 이렇게 :

constructorFunc = function() { 
    var _private = false; 

    return { 
     modifyPrivate: function(toVal) { 
      _private = toVal; 
      return this; 
     } 
    }; 
} 
var x = constructorFunc(); 
x.modifyPrivate(true); 

민간 _private에 액세스 할 수 있습니다 modifyPrivate 방법을,이 내부 범위에 정의되어 있기 때문이다. raina77ow에서 제안한대로 this을 반환하므로 원하는 경우 x의 다른 메소드 호출을 연결할 수 있습니다 (예 : modifyPrivate에 대해 foo을 정의한 경우 x.modifyPrivate(true).foo()). 당신이 정말로 그 범위에 대한 액세스 권한이없는 외부 함수의 값을 수정해야하는 경우


지금, 당신은 객체 당신에게 비공개의 값을 포장하고 개체를 전달할 수 있습니다. 이 경우 전달 된 값은 객체에 대한 참조이므로 해당 속성을 수정하면됩니다 (객체에 다시 할당하고 속성 만 조작하면 안 됨).

function modify(valObj, newVal) { 
    valObj.val = newVal; 
    // return whatever is apropriate 
} 
constructorFunc = function() { 
    var _private = { 
     val : false 
    }; 

    return { 
     modifyPrivate: function(toVal) { 
      return modify(_private, toVal); 
     } 
    }; 
} 
var x = constructorFunc(); 
x.modifyPrivate(true); 
+1

나는 setter에서'this'를 반환하는 것을 선호합니다.) – raina77ow

+0

의미가 있습니다. 'toVal'을 반환하는 것은 추측이었습니다. OP가 반환하려고하는 것이 확실하지 않습니다 (원래 코드는 'undefined'를 반환했습니다). – bfavaretto

+0

고마워, 너를 잡아. 실제로 수정 기능은 값이 있는지 여부에 따라 "설정 또는 가져 오기"이며, 값이 변경되면 내 데이터베이스를 업데이트하고 값을 캐시하여 데이터베이스에서 항상 가져 오지는 않습니다. "이 질문을"어떻게해야합니까? "내 'setOrGetMethod'가 bfavaretto와 같은 '수정'함수로 캡슐화 된 인라이닝을 피할 수 있습니까? 그 이유는 _private에서 익명 메서드로 논리를 인라이닝해야 불필요한 것 같습니다. 방법을 생각해 봅시다 ... 내 모든 사물을 객체에 넣고 객체를 전달해야합니다. – JayPrime2012

관련 문제