做百度前端技术学院对象原型继承时,对这个问题题目的不解?

百度前端技术学院对象原型继承时,对这个问题题目的不解

image.png

我理解的继承应该是这样的,通过原型链将函数的prototype链接起来,当生成一个新的实例(new)的时候,再将该实例加入到原型链中,从而实现对一些方法或属性的复用。
image.png

而看这里的描述是直接将构造函数Teacherprototype指向了Person
image.png

Teacher 构造函数继承 Person 所有的属性和方法


Teacher 的原型指向 Person

对于这里的测试用例也不太理解

var teacherWang = new Teacher("Miss Wang", "28", "English");


//获取 obj 的原型对象
function getProto(obj) {
  // your code here
}

console.log(getProto(teacherLiu)); // -> Teacher

这里的返回值为什么是Teacher呢?我们通过new创建的一个对象,它的[[Prototype]]应该是Teacher.prototype才是。

在这个描述中,出现了原型原型对象两个名词,原型应该是说的是prototype,原型对象说的应该是[[Prototype]],这俩个翻译的出处在哪里呢?为什么要用这两个词来区分它们呢?

阅读 656
avatarAI BotBETA

你的问题很好,对于 JavaScript 的原型继承和原型链,理解起来确实有些复杂。下面我会尝试解答你的问题。

首先,JavaScript 的原型继承是通过原型链来实现的。每一个 JavaScript 对象都有一个指向其原型的内部链接。当我们试图访问一个对象的属性时,如果该对象自身没有这个属性,那么 JavaScript 会在对象的原型(也就是[[Prototype]])上寻找这个属性,如此递归,直到找到这个属性或者到达原型链的末尾(即 null)。

在你的例子中,Teacher 的原型被设置为 Person。这意味着,如果 Teacher 对象没有某个属性或方法,那么 JavaScript 会在 Person 上寻找这个属性或方法。这就是所谓的“继承”。

关于你的测试用例:

var teacherWang = new Teacher("Miss Wang", "28", "English");
console.log(getProto(teacherWang)); // -> Teacher

这里返回的是 Teacher,这是因为 teacherWang 的原型是 Teacher.prototype,也就是 Teacher 构造函数本身。在这个例子中,getProto 函数可能只是返回了传入对象的原型对象。注意,JavaScript 中并没有一个名为 getProto 的内置函数,这可能是你提供的自定义函数。

至于你提到的“原型对象”,其实在 JavaScript 中并没有这个概念。我们通常所说的“原型”就是指对象的原型,也就是对象的 [[Prototype]]。当我们说“prototype”时,我们指的是一个对象的构造函数或者类用来定义新创建的对象可以继承的属性和方法。而当我们说“[[Prototype]]”时,我们指的是一个对象的实际原型对象,也就是这个对象继承其属性和方法的对象。

希望这个解答能帮助你理解 JavaScript 的原型继承和原型链。如果你还有其他问题,欢迎继续提问。

1 个回答
  • 第一个问题:答案是 Teacher.prototype
  • 第二个问题,国内翻译很多,也有叫做隐式显式的,但以 MDN 文档为准即可

Constructor.prototype 称为函数的自有原型
someObject.__proto__ 称为原型
image.png
image.png

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
宣传栏