JavaScript中的原型和继承不能像我期望的那样运行

时间:2012-05-23 17:12:11

标签: javascript inheritance

我一直在学习JavaScript中的类,原型的使用以及最后如何继承。

根据我的理解,下面应该:

  1. 由于myInstance.getIt();被称为
  2. 而提醒“John”
  3. 由于myInheritedInstance.getIt();被称为
  4. 而提醒“杰克”
  5. myInheritedInstance.getParent();已分配到MyClass
  6. 中的.getIt()
  7. 这应该在myInheritedInstance.getParent()时警告“John”;被称为。
  8. 相反,实际发生的是:

    1. 提醒“约翰”
    2. 警告空白
    3. 提醒“杰克”
    4. 我有一种感觉,我做了一些愚蠢的事情,或者误解了一个基本概念,所以任何帮助都会受到赞赏。

      var MyClass = function() { };
      
      MyClass.prototype.constructor = MyClass;
      MyClass.prototype.name = "John";
      MyClass.prototype.getIt = function () { alert(this.name); };
      
      var myInstance = new MyClass();
      myInstance.getIt();
      
      //Now inheritance
      
      var MyInheritedClass = function () { };
      MyInheritedClass.prototype = new MyClass;
      MyInheritedClass.prototype.constructor = MyInheritedClass;
      MyInheritedClass.prototype.name = "Jack";
      MyInheritedClass.prototype.getIt = function () { alert(this.name); };
      MyInheritedClass.prototype.getItParent = MyClass.prototype.getIt.call(this);
      
      var myInheritedInstance = new MyInheritedClass();
      myInheritedInstance.getIt();
      myInheritedInstance.getItParent();
      

1 个答案:

答案 0 :(得分:3)

罪魁祸首是:

MyInheritedClass.prototype.getItParent = MyClass.prototype.getIt.call(this);

.call调用一个函数,而不是返回一个函数。因此它会导致两个问题:它事先调用它,并返回一些不可调用的东西(在控制台中出现错误)。你必须这样做:

MyInheritedClass.prototype.getItParent = function() {
    alert(Object.getPrototypeOf(Object.getPrototypeOf(this)).name);
};

问题是name不再可以通过this访问,因为它已被继承的类遮蔽了。要获得原始类的name,您必须两次走原型链:inherited instance -> inherited prototype -> original prototype

该行

MyClass.prototype.constructor = MyClass;
顺便说一句,这里没有必要

。如果您覆盖constructor,则需要还原prototype,因为constructor在这种情况下会丢失。所以在你的情况下,只有继承的类才有必要。

此外,该行

MyInheritedClass.prototype.getIt = function () { alert(this.name); };

是多余的,它与您继承的MyClass.prototype.getIt相同。

请注意,JavaScript没有真正的“类”,尽管它们的行为可以像这样完成。