这是因为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 :)
在这里,我们将prototype
ofSubType
设置new SuperType
在构造函数之外。因此,当您调用JavaScript 时,会创建一个继承自当时new SubType
的新对象。因此,实例也继承自。SubType.prototype
new SuperType
SuperType
示例 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 沙阿 | 为什么原型继承很重要