0

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

据我了解,以下应该:

  1. myInstance.getIt();被呼叫而提醒“John”
  2. myInheritedInstance.getIt();被呼叫而提醒“杰克”
  3. myInheritedInstance.getParent();已分配到.getIt()MyClass
  4. 这应该会在 myInheritedInstance.getParent(); 时提醒“John”。叫做。

相反,实际发生的是:

  1. 警报“约翰”
  2. 警报空白
  3. 提醒“杰克”

我有一种感觉,我做了一些愚蠢的事情或误解了这里的基本概念,所以任何帮助将不胜感激。

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();
4

1 回答 1

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 没有真正的“类”,尽管它们的行为可以像这样完成。

于 2012-05-23T17:18:14.660 回答