2012-02-15 2 views
3

부모로부터 자식 객체로 상속 된 메서드에서 변수에 대한 액세스 가능성을 연구하고 있습니다.JavaScript로부터의 변수 액세스 상속 된 메서드

var Parent = function() { 
    var self = this; 

    this.init = function() { 
     self.name = 'Abram'; 
    }; 
    this.getName = function() { 
     alert('self.name = ' + self.name); 
    }; 
    this.init(); 
}; 

와 자식 클래스 :

Function.prototype.extend = function(child) { 
    var prototype = new this; 

    child.prototype = prototype; 
    return child; 
}; 

그래서 내가 부모 클래스를 정의

:

상속은 자녀의 생성자의 프로토 타입 부모의 인스턴스를 연결하는 수행

var Baby = Parent.extend(function(name) { 
    var self = this; 

    this.init = function() { 
     self.name = name; 
    }; 
    this.init(); 
}); 

// instantiate a child object: 
var baby = new Baby('Jimmy'); 

// call the inherited method: 
baby.getName(); // undefined! 

getName 메서드는 올바르게 상속되지만 self.name 회원에게는 액세스 권한이 없습니다.
어떻게하면 하위 클래스 인스턴스의 범위에서 사용할 수 있습니까?

alert(baby.getName)와 방법의 시체를 확인 내가 얻을 :

내가 예상 정확히 무엇
function() { 
    alert("self.name = " + self.name); 
}

.
그러나 왜 self 변수가 로컬에서 해결되지 않습니까?

답변

3

부모 "getName()"함수의 변수 "self"는 부모 인스턴스를 나타냅니다. 자식의 "init"함수는 프로토 타입 객체가 아니라 해당 객체의 이름을 설정합니다. 따라서

: 더 "getName"속성에이 없기 때문에 문자열 "지미"

  • baby.getName();로 설정 "이름"속성을 가진 객체에

    1. var baby = new Baby("Jimmy"); 결과는 프로토 타입 객체에 함수를 호출 "아기"개체. 그 함수 안에서, 변수 "self"에 대한 참조가 만들어 지는데, 이것은 객체 "baby"에 대한 프로토 타입 객체 — 이 아니라을 참조합니다. 프로토 타입 객체에는 "이름"속성이 설정되어 있지 않습니다.

    this.name 대신 self.name를 사용하는 프로토 타입의 .getName() 기능을 변경하면 무슨 일이 일어 나는지 확인하십시오.

  • +0

    고마워요. @ 포인트, 나는 이미 this.name으로 self.name을 변경해 보았습니다. (아직 닫히지 않은 그 레벨에서) 작동하지만, 로컬로 이름이 지정된 멤버는 정확하게 내가 얻고 자하는 이점입니다. 효과적인 코드 재사용을 위해, 예를 들어 중첩 된 함수 범위에서 munge합니다. –

    +0

    글쎄, 문제는 "부모"함수에서 "self"의 바인딩이 항상 원래의 객체 인스턴스에 있다는 것입니다; 거기 때문에 폐쇄의 "붙어있어". – Pointy