这是因为new运算符在 JavaScript 中的工作方式。当您new在函数调用之前使用时,会发生以下情况:
- 我们从函数的 中创建一个新对象
prototype(例如var instance = Object.create(func.prototype))。
- 我们将
this函数的指针设置为新创建的对象(例如var result = func.apply(instance, arguments))。
- 如果结果不是对象或函数,我们将返回实例(例如
if (typeof result === "object" || typeof result === "function") return result; else return instance;)。
现在忘记其他一切,只关注第一点——实例对象创建阶段。
示例 1:
function SubType(name) {
}
SubType.prototype = new SuperType;
// THE ABOVE WORKS :)
在这里,我们将prototypeofSubType设置new SuperType在构造函数之外。因此,当您调用JavaScript 时,会创建一个继承自当时new SubType的新对象。因此,实例也继承自。SubType.prototypenew SuperTypeSuperType
示例 2:
function SubType() {
SubType.prototype = new SuperType;
}
// THE ABOVE DOESN'T WORK :(
new SubType在我们设置SubType.prototype为之前,我们在这里调用new SuperType。SubType.prototype 因此,实例对象继承自它被设置为new SuperType. 因此该实例不继承自SuperType.
结论:
要了解继承在 JavaScript 中的工作原理,我建议您阅读以下文章:
- JavaScript继承和构造函数属性 - 代码日志
- 没有办法在 javascript 中拥有基于类的对象?- 堆栈溢出
- javascript - 原型继承优于经典的好处?- 堆栈溢出
- 阿迪特 M 沙阿 | 为什么原型继承很重要