我前几天写了两个类,我需要重写并调用重写的方法(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
奇怪。我不明白为什么它不应该工作(尽管你使用罕见的习惯做继承,超级构造函数调用通常是'SimpleUser.call(this)'没有'base',你也错过了'User.prototype = Object.create SimpleUser.prototype)',因为链式原型是正常的,但它们都不应该是你的功能问题)。 – 2011-12-03 16:25:41