【问题标题】:Reasoning about and finding the top most "parent" prototype object of a class instance?推理并找到类实例的最顶层的“父”原型对象?
【发布时间】:2021-08-01 19:48:07
【问题描述】:

美好的一天。

我正在学习 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) 现在如果没有找到,控制台会在“对象原型”(导师制定的方式)上寻找它。

我得到了以上所有信息,并且类实例具有它所引用的原型模板,可能还有其他模板。对我来说令人困惑的部分是在第(3)步,这里的原型是什么?它在看全局对象吗?那会是窗口对象吗?这部分对我来说仍然有点不稳定。

非常感谢。

【问题讨论】:

    标签: javascript class object oop prototype


    【解决方案1】:

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

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

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

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

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

    Object.prototype 但是没有原型:

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

    原型链到此结束。


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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-12-16
      • 1970-01-01
      • 2011-01-10
      • 1970-01-01
      • 1970-01-01
      • 2013-10-06
      • 2018-11-22
      • 1970-01-01
      相关资源
      最近更新 更多