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

Reasoning about and finding the top most "parent" prototype object of a class instance?

美好的一天。

我正在学习 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) 如果它在那里找不到它,它将在 Pet 原型中寻找它,由 extends 关键字提供。

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

我得到了以上所有内容,并且 class 实例有一个它引用的原型模板,可能还有其他模板。令我困惑的部分特别是在第(3)步,这里的原型是什么?它在寻找全局对象吗?那是 window 对象吗?这部分对我来说还是有点摇摇欲坠。

非常感谢。

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

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

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

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

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

Object.prototype 然而没有原型:

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

这是原型链结束的地方。


总而言之,引擎不会认为“哦,我现在必须查看 Object.prototype”,它只知道查看对象的原型,无论它是什么。只是 Object.prototype 是“普通”对象的默认原型。