2012-08-29 4 views
3

나는 JS 초보자이며, 이해를 돕기 위해 Javascript Patterns 책을 읽었다. 내가 볼 수있는 코드 조각 중 하나 이것은 새로운 속성을 나타냅니다Javascript : 함수에 새 속성을 추가하지 않으려면 어떻게해야하나요?

var myFunc = function param() { 
... 
... 
}; 
myFunc.cache={}; 

는 함수 본문 외부의 누군가에 의해 추가 할 수 있습니다. 이것은 캡슐화를 깨뜨리지 않습니까? 프로그램의 다른 부분에서 새로운 속성을 계속 추가하여 개체 생성을 부피가 커지게한다면 어떻게 될까요? 누군가 내가 정의한 속성을 삭제/수정하면 어떻게 될까요?

나는 이것이 "문제"라고 부르는 것이 옳은지 나는 모른다. 그러나 만약 그렇다면, 이것을 피하는 접근법으로 도움을 청하십시오.

감사합니다.

답변

3

JavaScript는 실제로 개체를 보호 할 수있는 옵션이 없었지만 이제 ECMAScript 5부터는 freeze 개체를 사용할 수 있습니다.

var o = { a: 1, b: 2 }; 
Object.freeze(o); 
console.log(o.a); // 1 
o.a = 2; 
console.log(o.a); // 1 

오류가 발생할 수있는 엄격 모드로 알려진 새로운 컨텍스트가 있습니다.

function processObject(o) { 
    "use strict"; 
    delete o.a; // throws a TypeError 
} 
+0

엄격 모드를 사용하지 않으면 freeze() 후에도 추가/삭제할 수 있습니까? – WinOrWin

+1

@WinOrWin - 엄격 모드가 아닌 경우 코드가 실행되지만 아무 것도 나타나지 않습니다. 그래서 그들은'o.c = 3'을 원하는만큼 쓸 수 있지만'o'는 그대로 남아 있습니다. – ChaosPandion

0

새로운 속성은 언제든지 추가 할 수 있지만 반드시 나쁜 것은 아닙니다. 구현을 오버라이드하는 기능은 매우 강력합니다.

일반적으로, 당신은 함수 프로토 타입 등의 방법, 개체를 추가 할, 그래서

myFunc.prototype.cache = {}; 

은 궁극적으로 당신은 모듈 패턴

http://www.yuiblog.com/blog/2007/06/12/module-pattern/

같은 것을 따라야 할 것입니다 노력하겠습니다

http://www.adequatelygood.com/2010/3/JavaScript-Module-Pattern-In-Depth

모듈 패턴을 사용하면 privil이있는 "개인"회원을 만들 수 있습니다 클로저를 통해 데이터에 대한 액세스가 향상되었습니다.

1

캡슐화를 중단하지 않습니까?

예 아니오. 클로저를 사용하는 경우 인스턴스화 시점에 선언 된대로 개체의 함수 외부에서 액세스 할 수없는 "개인"변수가있을 수 있습니다. 예 : ObjectPrototypeInnerPrototype의 새로운 인스턴스를 반환하고 privateVariableObjectPrototype 폐쇄 내에 존재

var ObjectPrototype = function() { 
    var privateVariable = "closure-scope value"; 
    var InnerPrototype = function() { 
     this.getPrivate = function() { return privateVariable; }; 
    }; 
    return new InnerPrototype(); 
}; 
var myObject = new ObjectPrototype(); 

때문에, 외부에서 직접 privateVariable에 액세스 할 수있는 방법이 없습니다. 그 가치를 얻는 유일한 방법은 myObject.getPrivate()입니다.

참고 : 자바 스크립트는 객체와 배열을 참조로 전달하므로이 메서드는 복제본을주의해서 반환하지 않는 한 간단한 값만 보호합니다.

프로그램의 다른 부분에서 새 속성을 계속 추가하면 내 개체를 부피가 커지게합니까?

이것은 눈을 떼지 않아도됩니다.

누군가 나를 정의한 속성을 삭제하거나 수정하면 어떻게됩니까?

이 문제를 방지하려면 위에서 설명한 클로저 범위 지정 방법을 사용하십시오.

관련 문제