【问题标题】:How is Constructor Function + Prototype not the same thing as a Class?构造函数+原型与类有何不同?
【发布时间】:2016-05-13 16:33:17
【问题描述】:

我不断听到 JavaScript 之所以如此优秀的原因之一是因为它没有类。相反,它有一个神奇的东西,叫做原型继承。

纠正我如果我错了,但据我了解,Object.prototypeObject.prototype.constructor(运行一些本机代码)是 Javascript 中的两个基本实体。这和一堂课有什么区别?

如果在使用 newoperator 调用时没有用于创建对象的“蓝图”,那么每个函数都需要有 .prototype 吗?

【问题讨论】:

  • 好问题。您所描述的正是 TypeScript 如何获取 ES6 类并将它们编译为 ES5。他们是我们目前最好的选择。如果你看输出的 JS classes 构造函数对象变成object.prototype.something
  • 你在哪里“一直听到”这个?这些都是奇怪的说法。
  • ...无论如何,原型不是蓝图。它是用于查找原始对象上不存在的属性的对象。原型对象可以并且经常在许多不同对象之间共享。
  • 任何人都会笼统地说 JS 是一门优秀的语言,因为它的原型继承(或者因为任何原因),并且有什么神奇之处它。

标签: javascript prototype new-operator ecmascript-5 prototypal-inheritance


【解决方案1】:

如果你挖掘得足够深,这个问题可能会引发非常深入的讨论,但我能想到的最简单的比喻(一种广泛使用的)是将“类”视为蓝图,将“对象”视为房子。在基于类的系统中,您可以根据蓝图“建造”(实例化)房屋。你可以在这些房子里“生活”(调用方法等)。但是你不能“生活”在蓝图中。它们仅用于建造房屋。

在 JS 中,您没有蓝图。你只有房子。您可以复制房屋并在其中“生活”,并根据需要使每个房屋都不同(保存单个状态等)。但它们都是彼此的副本。没有涉及蓝图。

【讨论】:

  • 如果你给父母的房子加了一个游泳池,那么所有的孩子都会得到一个游泳池
  • @maioman:只有父母的房子有游泳池。孩子们的房子可以使用他们父母的游泳池。
  • @Eric 你应该解释一下原型继承中没有实际的复制。您的第二段似乎暗示从另一个继承的每个对象都会获得该继承对象的实际副本。
  • @squint 如果您要添加池,他们可以访问同一个池.. 但您可以使用构建池方法(父子房屋可以创建许多池)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-04-30
  • 1970-01-01
  • 2014-11-03
  • 2016-01-05
  • 1970-01-01
  • 2019-05-06
  • 1970-01-01
相关资源
最近更新 更多