2013-08-21 5 views
4

다음은 작동하지 않습니다. getter에서 'class'Person에 _nickname이 정의되어 있지 않습니다.Object.DefineProperty 사용 및 개인 범위의 변수 액세스

어떻게해야합니까? 함수 내에서 Person의 프로토 타입에 _nickname을 추가하는 방법이 있습니까?

+0

빠른 팁 :'args === undefined || args === null'은'args == null'과 동일합니다. 왜냐하면'null == undefined'이기 때문입니다. 다른 비교와 같은 것. – elclanrs

+0

아, 나는 JsLint에 대해 까다 롭다. 그는 ==을 좋아하지 않는다. 나는 그것을 바로 잡았다. 나는 너무 조심 스러울 지 모르겠다. 그러나 나는 JS 폐쇄가 그것을 돌볼 수 있기를 바랐다 :-) – Matt

+3

JSHint는 나의 차 잔이다. 이 특별한 경우를위한 옵션이 있습니다 : [eqnull] (http://www.jshint.com/docs/options/#eqnull) – elclanrs

답변

5

함수 내에서 Person의 프로토 타입에 _nickname을 추가하는 방법이 있습니까? 당신이 (내 생각에 그것은 매우 우아 보이지 않지만), 확인 Person 생성자 의미하는 경우

:이 경우

var Person = function (args) { 
    var _nickname = ''; 
    if (args === undefined || args === null) { 
     return; 
    } 
    if (args.nickname !== undefined && args.nickname !== null) { 
     _nickname = args.nickname; 
    } 
    Object.defineProperty(this, "nickname", { 
     get : function() { 
      return _nickname; 
     } 
    }); 
} 

var x = new Person({ 
    nickname : 'bob' 
}); 

console.log(x.nickname); 

http://jsfiddle.net/JEbds/

를, 당신의 게터는 또 다른 클로저입니다 따라서 _nickname에 액세스 할 수 있습니다. 그리고 프로토 타입에 더 이상 있지 않아요, 당신은 그것을 달성하기 위해 자신의 속성이 필요합니다.

+0

하지만 'new Person()'을 실행할 때마다 Object.defineProperty가 실행되지 않습니다. ? 아니면 그다지 큰 문제가 아닌가? 그것이 내가 피하고 싶었던 것입니다. – Matt

+0

있습니다. 그러나 생성자에서 실행하지 않으면 결코'_nickname'에 액세스 할 수 없습니다. – bfavaretto

+1

@Matt 당신이 정말로 개인적인 것이 아니라면 괜찮을 것입니다.'this._nickname'을 사용할 수 있습니다. (또한 쓰기 가능 : false로 설정할 수 있기 때문에 생성자에서 설정 한 값을 절대로 변경할 수 없습니다). http://jsfiddle.net/669Gb/ – bfavaretto