我一直在学习JavaScript中的类,原型的使用以及最后如何继承。
根据我的理解,下面应该:
myInstance.getIt();
被称为myInheritedInstance.getIt();
被称为myInheritedInstance.getParent();
已分配到MyClass .getIt()
相反,实际发生的是:
我有一种感觉,我做了一些愚蠢的事情,或者误解了一个基本概念,所以任何帮助都会受到赞赏。
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();
答案 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没有真正的“类”,尽管它们的行为可以像这样完成。