2011-12-03 42 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

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

回答

0

Javascript没有课程。它只有对象。并且对象从它们的原型继承而来,而原型继承自它们的原型等等。如果你想了解更多关于在JavaScript中继承的内容,请看http://phrogz.net/js/classes/OOPinJS2.html。虽然这是可行的,但如果你想在JavaScript中模仿类和类继承,我推荐使用为此设计的框架,比如MooTools。

+2

但是,张贴的代码实际上工作正常。 – Pointy