【发布时间】:2011-12-03 16:17:41
【问题描述】:
前几天我写了两个类,我需要重写并调用被重写的方法(getQuery)。
//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:jsfiddle.net/qqeV3。 -
你为什么不使用
var User = new SimpleUser(); -
奇怪。我不明白为什么它不应该工作(尽管您使用不常见的习语进行继承,但超级构造函数调用通常是
SimpleUser.call(this)而没有base并且您也会错过User.prototype = Object.create(SimpleUser.prototype),因为链接原型是正常的;但没有其中应该是您的功能的问题)。 -
当我复制/粘贴您的代码时,我得到
first=X&last=Y作为最后一个console.log的结果。那么有什么问题呢?
标签: javascript class parent-child hierarchy