2013-11-27 2 views
0

초보자 자바 스크립트 질문 :공용 메서드에서 개인 클래스 속성에 액세스 할 수 있습니까?

공개 메소드에서 개인 클래스 속성에 액세스하는 방법은 무엇입니까? 모든 예제에서 public (this.property)에 액세스하는 public 프로토 타입 함수를 볼 수 있습니다. 공용 메서드에서 개인 속성에 액세스 할 수 있습니까?

+1

JavaScript에 비공개 또는 공개 속성 개념이 있다고 생각하지 않습니다. 사실, 클래스는 언어에 고유하지 않습니다. 일반적으로 OOP 기능을 사용하려면 타사 라이브러리를 사용해야합니다. –

+0

@FarleyKnight JavaScript는 OO 기반 프로토 타입을 사용합니다. 타사 라이브러리에서도 변경되지 않습니다. TypeScript 또는 Dart를 사용하는 경우 클래스 기반의 언어를 사용하고 JavaScript로 컴파일합니다. 프로토 타입 기반이라 할지라도 private 변수를 가질 수 없으므로이 라이브러리는 private 변수를 공용으로 컴파일합니다. 클로저를 사용하여 멤버를 완전히 숨길 수는 있지만 실제로는 private이 아닙니다. 동일한 유형의 인스턴스는 다른 인스턴스의 "privates"를 볼 수 없습니다. – HMR

+0

JavaScript의 프로토 타입 및 생성자 함수에 대한 소개 글을 작성했습니다. JS OOP가 작동하는 방식은 클래스 기반이 아니며 익숙해 질 수도 있습니다. 비밀 성을 시뮬레이션 할 수있는보다 복잡한 패턴으로 들어가기 전에 기본을 읽고 이해하여 다음 패턴을 사용하여 희생하고있는 것을 알 수 있도록 조언합니다. http://stackoverflow.com/a/16063711/1641941 – HMR

답변

3

이 패턴을 "권한있는"방법이라고합니다. 다음과 같이 보입니다 :

function MyClass() { 
    var secret = "foo"; 
    this.tellSecret = function() { 
    return secret; 
    }; 
} 

var inst = new MyClass(); 
console.log(inst.tellSecret()); // => "foo" 
console.log(inst.secret);  // => undefined 

이것은 개인 변수가 클로저에 있기 때문에 효과가 있습니다. 이 문제는 프로토 타입이 아닌 각 인스턴스에 권한있는 메소드를 추가한다는 것입니다. 이상적이지 않습니다. 종종, 대신 자바 스크립트에서 개인 변수를 필요없이, 저자는 다만 통상적으로 그 공개 방법을 의미하는 데 사용되는 밑줄을 사용합니다/속성은 비공개로 처리해야합니다

: 여기
function MyClass() { 
    this._secret = "foo"; 
} 

MyClass.prototype.tellSecret = function() { 
    return this._secret; 
}; 
0

약간의 데모입니다
var Foo = function(name){ 
    this.name = name; 
    var t = name; 
    if(typeof(this.show) != 'function'){ 
     Foo.prototype.show = function(){ 
      console.log(t); 
      console.log(this.name); 
     }; 
    } 
}; 

var a = new Foo('a'); 
var b = new Foo('b'); 
b.show(); // ... 

희망이 있으면 도움이 될 것입니다.

+0

이것은 생각하는대로하지 않습니다. [이것을보십시오] (http://jsfiddle.net/aAnM4/). "b"를 예상하면 "a"를 표시합니다. –

+0

't'는 각 인스턴스마다 다르다고 생각할 수도 있지만 실제로는 그렇지 않습니다. 클로저는 첫 번째 인스턴스가 만들어지고 다른 인스턴스가 모두이를 공유 할 때 한 번 만들어집니다. – HMR

관련 문제