推理并找到 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
是“普通”对象的默认原型。
美好的一天。
我正在学习 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
是“普通”对象的默认原型。