2011-12-03 4 views
0

요 전날 두 개의 클래스를 작성했는데, 여기에서 재정의 된 메소드 (getQuery)를 재정의하고 호출해야했습니다.JavaScript 계층 구조, 부모 변수가 정의되지 않은 이유는 무엇입니까?

//parent 
function SimpleUser() { 
    this.firstName = "X"; 
} 

SimpleUser.prototype.getQuery = function(sub) { 
    //solution for not getting undefined variables 
    var that = sub || this; 
    var query = "first="+that.firstName; 
    return query; 
} 

//child 
function User() { 
    //extends 
    this.base = SimpleUser; 
    //super() 
    this.base(); 

    //prints "X" 
    console.log(this.firstName); 

    this.lastName = "Y"; 
} 

//override 
User.prototype.getQuery = function() { 
    //call parent 
    var query = SimpleUser.prototype.getQuery.call(this); 
    query += "&last="+this.lastName; 
    return query; 
} 

//prints "first=X" 
console.log(new SimpleUser().getQuery()); 

//prints "first=undefined&last=Y" if I don't use parameter "sub" 
console.log(new User().getQuery()); 

하위 클래스에서 "getQuery"메서드를 호출하면 부모의 모든 변수가 정의되지 않습니다. 하위 클래스의 생성자에서 호출하면 괜찮습니다.

나는 하위 클래스를 매개 변수로 전달하고 누가 묻고 있는지 확인하여 문제를 해결했습니다.

이 문제가 발생하는 이유를 설명해 주시고 하위 클래스 자체를 매개 변수로 전달하는 것보다 나은 솔루션을 찾을 수있게 도와 주실 수 있습니까?

감사합니다.

+0

'sub'가 없어도 작동하는 것으로 보입니다. http://jsfiddle.net/qqeV3/. – pimvdb

+0

왜'var User = new SimpleUser(); '를 사용하지 않았습니까? – StuperUser

+1

이상한. 왜 그것이 작동하지 않아야하는지 모르겠다. (당신이 흔하지 않은 관용구를 사용하여 상속을하지만 슈퍼 생성자 호출은 보통'base'가없는 SimpleUser.call (this)이 될 것이고 당신은 또한 User.prototype = Object.create SimpleUser.prototype)', 프로토 타입을 연결하는 것이 일반적이므로, 그 중 아무 것도 기능에 문제가 없어야합니다. –

답변

0

자바 스크립트에는 클래스가 없습니다. 객체 만 있습니다. 그리고 객체는 프로토 타입을 상속하며 프로토 타입을 상속받습니다. 자바 스크립트에서 상속을 만드는 방법에 대해 자세히 알고 싶다면 http://phrogz.net/js/classes/OOPinJS2.html을 살펴보십시오. 이 작업은 가능하지만 자바 스크립트에서 클래스와 클래스 상속을 모방하려면 MooTools와 같은 프레임 워크를 사용하는 것이 좋습니다.

+2

하지만 게시 된 코드는 실제로 정상적으로 작동합니다. – Pointy

관련 문제