【问题标题】:JavaScript hierarchy, why is parent variables undefined?JavaScript层次结构,为什么父变量未定义?
【发布时间】: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”时,父类中的所有变量都未定义。如果我从子类的构造函数中调用它们,它们就很好。

我通过将子类作为参数传递并检查谁在询问来解决问题。

有人可以向我解释为什么会发生这种情况并帮助我找到比将子类本身作为参数传递时更好的解决方案吗?

谢谢!

【问题讨论】:

  • 它似乎工作,也没有subjsfiddle.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


【解决方案1】:

Javascript 没有类。它只有对象。并且对象从它们的原型继承,而原型又从它们的原型继承等等。如果您想了解有关在 javascript 中进行继承的更多信息,请查看http://phrogz.net/js/classes/OOPinJS2.html。虽然这是可行的,但如果你想在 javascript 中模拟类和类继承,我建议使用为此设计的框架,例如 MooTools。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-23
    相关资源
    最近更新 更多