요 전날 두 개의 클래스를 작성했는데, 여기에서 재정의 된 메소드 (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"메서드를 호출하면 부모의 모든 변수가 정의되지 않습니다. 하위 클래스의 생성자에서 호출하면 괜찮습니다.
나는 하위 클래스를 매개 변수로 전달하고 누가 묻고 있는지 확인하여 문제를 해결했습니다.
이 문제가 발생하는 이유를 설명해 주시고 하위 클래스 자체를 매개 변수로 전달하는 것보다 나은 솔루션을 찾을 수있게 도와 주실 수 있습니까?
감사합니다.
'sub'가 없어도 작동하는 것으로 보입니다. http://jsfiddle.net/qqeV3/. – pimvdb
왜'var User = new SimpleUser(); '를 사용하지 않았습니까? – StuperUser
이상한. 왜 그것이 작동하지 않아야하는지 모르겠다. (당신이 흔하지 않은 관용구를 사용하여 상속을하지만 슈퍼 생성자 호출은 보통'base'가없는 SimpleUser.call (this)이 될 것이고 당신은 또한 User.prototype = Object.create SimpleUser.prototype)', 프로토 타입을 연결하는 것이 일반적이므로, 그 중 아무 것도 기능에 문제가 없어야합니다. –