초보자 자바 스크립트 질문 :공용 메서드에서 개인 클래스 속성에 액세스 할 수 있습니까?
공개 메소드에서 개인 클래스 속성에 액세스하는 방법은 무엇입니까? 모든 예제에서 public (this.property)에 액세스하는 public 프로토 타입 함수를 볼 수 있습니다. 공용 메서드에서 개인 속성에 액세스 할 수 있습니까?
초보자 자바 스크립트 질문 :공용 메서드에서 개인 클래스 속성에 액세스 할 수 있습니까?
공개 메소드에서 개인 클래스 속성에 액세스하는 방법은 무엇입니까? 모든 예제에서 public (this.property)에 액세스하는 public 프로토 타입 함수를 볼 수 있습니다. 공용 메서드에서 개인 속성에 액세스 할 수 있습니까?
이 패턴을 "권한있는"방법이라고합니다. 다음과 같이 보입니다 :
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;
};
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(); // ...
희망이 있으면 도움이 될 것입니다.
이것은 생각하는대로하지 않습니다. [이것을보십시오] (http://jsfiddle.net/aAnM4/). "b"를 예상하면 "a"를 표시합니다. –
't'는 각 인스턴스마다 다르다고 생각할 수도 있지만 실제로는 그렇지 않습니다. 클로저는 첫 번째 인스턴스가 만들어지고 다른 인스턴스가 모두이를 공유 할 때 한 번 만들어집니다. – HMR
JavaScript에 비공개 또는 공개 속성 개념이 있다고 생각하지 않습니다. 사실, 클래스는 언어에 고유하지 않습니다. 일반적으로 OOP 기능을 사용하려면 타사 라이브러리를 사용해야합니다. –
@FarleyKnight JavaScript는 OO 기반 프로토 타입을 사용합니다. 타사 라이브러리에서도 변경되지 않습니다. TypeScript 또는 Dart를 사용하는 경우 클래스 기반의 언어를 사용하고 JavaScript로 컴파일합니다. 프로토 타입 기반이라 할지라도 private 변수를 가질 수 없으므로이 라이브러리는 private 변수를 공용으로 컴파일합니다. 클로저를 사용하여 멤버를 완전히 숨길 수는 있지만 실제로는 private이 아닙니다. 동일한 유형의 인스턴스는 다른 인스턴스의 "privates"를 볼 수 없습니다. – HMR
JavaScript의 프로토 타입 및 생성자 함수에 대한 소개 글을 작성했습니다. JS OOP가 작동하는 방식은 클래스 기반이 아니며 익숙해 질 수도 있습니다. 비밀 성을 시뮬레이션 할 수있는보다 복잡한 패턴으로 들어가기 전에 기본을 읽고 이해하여 다음 패턴을 사용하여 희생하고있는 것을 알 수 있도록 조언합니다. http://stackoverflow.com/a/16063711/1641941 – HMR