2009-07-12 3 views
1

private 변수를 사용하는 기존 객체에 메서드를 적용하려고합니다. 내가 my_obj.myMethod()를 가면 나는 ID가 정의되지 않은 말하는 오류가자바 스크립트에서 객체 및 전용 변수에 메서드 적용

function a(given_id) 
{ 
    var id= given_id; 
} 

지금 내가 지금 너무

my_obj = new a('some_id'); 
my_obj.myMethod = function(){ 
    alert(id); 
} 

처럼 몇 가지 새로운 방법을 적용 할 : 목표는 설정과 같이이다 . id를 공개로 변경하면이 동일한 코드가 작동합니다.

myMethod가 원래 권한있는 메소드로 정의 된 경우 작동 할 수 있기 때문에 왜 이런 일이 발생하는지 이해할 수 없습니다. 내가 생각할 수있는 유일한 것은 myMethod가 권한있는 메소드 대신 public 메소드로 추가된다는 것입니다.

이것에 대한 정보는 크게 감사하겠습니다.

답변

2

var id = ... 대신 var.is = this.id =를 사용하십시오 (var는 함수 범위를 일명 지역 변수로만 제공합니다).

{편집} 시도 :

function Foo(givenId) 
{ 
    var id = givenId; 

    this.Bar = function() { 
     WScript.Echo(id); //change this to alert(...) 
     } 
} 

var foo = new Foo(52); 
foo.Bar(); 

다시 함수에 VAR 기능 범위 (지역 변수)가 있습니다. 액세스 권한을 원하면 권한 함수를 외부 함수의 내부 함수로 선언하고 클로저를 사용하여 액세스 권한을 얻으십시오.

+0

네, 그게 (위에서 언급 한대로) 고칠 것이라고 알고 있지만 id 변수를 비공개로 유지하고 싶습니다. var id는 권한이있는 메소드에서 액세스 할 수 있어야합니다. 객체에 계속 적용하면서 권한있는 메소드로 선언하는 방법은 무엇입니까? – Ori

+0

답을 인라인으로 수정하십시오. –

+0

예, Foo에 Bar를 추가하려는 경우를 제외하고는 작동합니다. 즉, foo.Bar = function() {....}과 같은 것을해야한다는 것을 의미합니다. 이 구문을 사용하면 어떻게 특권으로 선언 할 수 있습니까? 답장을 보내 주셔서 감사합니다. – Ori

0

개인 변수에 대한 생각을 잘못 이해했다고 생각합니다. 당신이하려고하는 것은 그것이 보호 된 것처럼 private var에 접근하는 것이지만, JS 객체에는 보호 된 변수가 없다. 선언 밖의 객체를 수정하는 경우 조상으로 처리됩니다.

+0

개인 변수가 있고이를 반환하려면 권한이 부여 된 방법으로 수행 할 수 있습니다. 이러한 방법을 사용하여 변수를 사용할 수도 있습니다. 이 메소드는 this.methodName()을 사용하여 표시되지만 객체의 인스턴스에 메소드에 적용 할 때 어떻게 수행해야할지 모르겠다. – Ori

3

나는 당신이 private 변수에 액세스 할 수있는 "권한 방법", 기본적으로 방법을 만들려고 생각 : 당신은 생성자 외부 특권 Methos는 선언 할 수 없습니다

function a(given_id) { 
    var id= given_id; 

    this.myMethod = function() 
    { 
     alert(id); 
    } 
} 

을 당신이 경우에 때문에 그래서, 그들은 생성자의 종료에 접근하지 못한다. 권장

읽기 : 당신은 당신이 원하는 것을 할 수 없습니다

1

, 자바 스크립트에는 개인 회원 (자체)이 없기 때문에. 함수가 새 객체를 반환 한 후 constructor 함수 내부의 var가 즉시 삭제됩니다. 따라서 나중에 액세스 할 수있는 방법이 없습니다. 어딘가에 스틱을 만들 수있는 유일한 방법은 생성자 (this.foo = function() {};)에서 바로 멤버 함수를 선언하여 클로저에서 그것을 잡는 것입니다. 이 멤버 함수를 생성자에서 선언해야하는 이유는 클로저를 만들기 위해 중첩 된 범위가 있어야하기 때문입니다. 이 함수를 프로토 타입 객체의 멤버로 선언하거나 이미 생성 된 객체에 할당하여 중첩 된 범위를 잃어 버리므로 닫히지 않고 소위 private 멤버에 액세스 할 필요가 없습니다.

관련 문제