推理并找到类实例的最"parent"原型对象?



美好的一天。

我正在参加JS课程,现在我们正在介绍原型。我的问题与原型对象有关。

下面是代码示例:

class Pet {
constructor(name, age) {
this.name = name;
this.age = age;
}
eat() {
return `${this.name} is eating!`
}
}
class Dog extends Pet {
bark() {
return "Woof!"
}
eat() {
return `${this.name} scarfs his food!` 
}
}
const wyatt = new Dog("Wyatt", 13);

如果我在控制台中输入:wyatt.eat()

(1) 控制台将在 Dog 原型上查找 eat 方法。如果找到它,它将运行该方法。

(2)如果它在那里找不到它,它将查看它的宠物原型,由扩展关键字提供。

(3)现在,如果它在那里找不到它,控制台将在"对象原型"(导师制定它的方式)上查找它。

我得到了以上所有内容,并且类实例具有它引用的原型模板,可能还有其他模板。对我来说令人困惑的部分具体在步骤(3),这里的原型是什么?它是否在查看全局对象?那会是窗口对象吗?这部分对我来说还是有点摇摇欲坠。

非常感谢。

虽然你写的没有错,但现实更简单(IMO)。

如果您尝试访问对象的属性,引擎将首先检查对象本身(在您的情况下wyatt)是否具有该属性。如果没有,它将查看对象的原型(也是一个对象)并重复这些步骤,直到找到属性或直到对象不再具有原型。这就是它的全部内容。

一个对象只能有一个原型。您可以将其视为分配了对另一个对象的引用的"内部"属性。

我想下一个问题是,如何将原型分配给对象?您已经知道一种方法:extends关键字.
也许您缺少的一点是对象的默认原型Object.prototype

console.log(Object.prototype === Object.getPrototypeOf({}));

但是Object.prototype没有原型:

console.log(Object.getPrototypeOf(Object.prototype));

这就是原型链的终点。


总而言之,引擎不会想"哦,我现在必须看Object.prototype",它只知道看物体的原型,不管那是什么。只是Object.prototype是"普通"对象的默认原型。

最新更新