【问题标题】:Why isn't the object __proto__ the constructor function itself?为什么对象 __proto__ 不是构造函数本身?
【发布时间】:2022-08-16 04:24:09
【问题描述】:

我一直在阅读原型(只有函数具有的prototype 属性,以及所有对象都具有的__proto__)。

我的困惑是为什么我们首先需要prototype 属性。

取下面的代码sn-p:

function Dog(breed) {
  this.breed = breed;
}

let dog1 = new Dog(\'chow\');

我理解的方式,函数也是 JS 中的对象。含义 Dog 函数实际上是一个对象。一个“函数对象”。

那么为什么不是 dog1 的__proto__,只是 Dog “函数对象”?为什么需要另一个对象“Dog.prototype”作为中介?

代替:

dog1 -> Dog -> global Object

我们正在做:

dog1 -> Dog.prototype -> global Object
                  ↘ 
                   Dog -> global Function Object
  • 作为猜测,我会说这是因为 this 绑定。 this 并不意味着你认为它的意思,特别是如果你来自更理智的 OOP 语言,如 C++ 或 C#。

标签: javascript function inheritance prototype


【解决方案1】:

更新:所以我自己也在研究继承,发现这篇文章你可能会觉得有趣 - https://www.educba.com/inheritance-in-javascript/。特别是这些段落:

在 JavaScript 中,当创建一个对象时,它会创建一个链接,而不是复制通常在面向对象的编程语言中发生的行为或属性。在 Java 中,父子类是一个单独的实体,父类的属性/行为被复制到子类中。

在类继承的情况下也会创建类似的链接。这种模式称为行为委托模式,在 JavaScript 中通常称为原型继承。由于在 Java 中创建了一个副本,所有的箭头都是向下绘制的(属性和行为向下流动),而在 JavaScript 中,流动是向上的。

我认为这回答了您的问题,但无论哪种方式,这都是一本有趣的书。

原答案:

这篇文章中有一段我发现你可能会觉得有趣的摘录:

JavaScript 中有一些关于原型的误导。对象的原型与对象的原型属性不同。前者用于查找原型链中不存在的属性。后者用于使用 new 创建的对象,它将是新创建对象的原型。了解这个区别可以让你充分理解 JavaScript 中的原型属性。保存对象原型的值有时称为内部原型链接。它在历史上也被称为原型,一个有争议的名字。为了政治正确,它可以称为从 Object.getPrototypeOf(...) 返回的值。

来源:https://bytearcher.com/articles/understanding-prototype-property-in-javascript/

MDN 文档声明 proto 也已被弃用,因此也可能值得阅读他们的文章: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/proto

【讨论】:

  • 我觉得这解释了“什么”。但我并没有真正看到“为什么”部分。
  • 遇到了一些您可能会觉得有用的信息,lmk :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-01-29
  • 2021-11-05
  • 2010-09-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多