javascript - 我不清楚 JavaScript 函数/对象结构
问题描述
因此,我开始学习 JavaScript,以便为一些 ClojureScript 和 React 做好准备。我检查了许多描述,包括
- 关于 JavaScript 的 MDN Web 文档
- “JavaScript - The Good Parts”一书(有点陈旧,因为它是关于 JavaScript 1.7/1.8(2008 年之前))
- 和其他几个网络资源。
...而且我仍然不确定函数/对象概念的结构。我意识到 JavaScript 没有像 Java 这样的“经典”类型系统,但实际上是具有尖锐语法的Scheme 。{}
仍然...
描述中有一些模糊的词语使用(我们有类型(嗯?),类(嗯......),实例,继承,对象,原型,函数,构造函数,方法)......所有的使用都令人不快。甚至偶尔会出现一种类型,使用一种实际上没有一阶类型的语言。
如果我理解正确的话,抛开实际的 JavaScript“类”,它们是语法糖化的对象,带有一些额外的东西:
- 有对象,也有实例化为实例的函数。(我不确定对象和函数的真正区别是什么;它是实例树的根吗?)
- 对象实例(图中的蓝色)通过“原型”关系(它是“内部的”,因此被隐藏)形成一棵树。树根是实例Object.prototype。
- 有一个全局对象 Object,也称为“对象构造函数”。它具有对(未命名的对象)Object.prototype(也称为Object 原型对象)的可见“原型”引用。
- 我不确定全局对象Object是否确实是一个函数。它应该是。它是否有对Function.prototype的内部引用?
- 函数实例(图中的绿色)同样通过“原型”关系形成一棵树。树根是实例Function.prototype。
- 但也许它们并没有形成树,只是一个层次结构。毕竟,函数实例拥有原型链意味着什么?
- 有一个全局对象 Function,也称为“函数构造函数”。它具有对(未命名的对象)Function.prototype(也称为Function 原型对象)的可见“原型”引用。
- 如果我正确解释此文本
Function.prototype
,则保留仅对特定功能有意义的Function.prototype.length
值。Function.prototype.name
是什么赋予了?函数实例是否会影响 的所有相关值Function.protoype
?
- 如果我正确解释此文本
- 每个函数实例都引用其创建上下文及其代码(黄色)
- 最后,一个函数实例显然通过其“原型”值具有关联的原型。相反,该实例通过“构造函数”值引用回函数实例。不知道那是做什么的。
除非像“课程”这样的额外内容,我是否错过了一些东西。这是完全错误的吗?需要纠正什么?
解决方案
你谈论的一切都是一个对象:它有一个身份(在 OOP 意义上),它可以被变异。(对象旁边的另一种值是原语,它们是不可变的非引用值)。
对象具有属性(键值对,其中键是符号或字符串)和一些内部机制。这种机制的一部分是它的原型链接,可以通过 访问Object.getPrototypeOf
,指向一个对象或null
对象可以从该对象继承属性。
函数是具有扩展内部机制的对象,使它们可以调用。(引用代码和上下文是其中的一部分,但在这里并不重要)。
所有这些对象不一定是任何东西的“实例”,它们可以作为对象创建并且它们存在。
对象不形成树。原型链接引用具有另一个原型链接的对象,依此类推,形成原型链。当然,从同一个对象继承的多个对象形成了一个树状结构,但与树不同的是,孩子们引用他们的父母,而不是相反。此外,没有根节点,任何对象都可以链接null
而不是从任何东西继承——所以它充其量更像是一片森林。
这就是您需要了解的关于 JS 中对象结构的内容。我不打算扩展构造函数,它们的属性 name prototype
,以及它们如何通过继承形成具有“实例”的类结构。您可以在其他地方找到有关该模式的详细信息,以及它如何应用于内置Object
和Function
层次结构。
推荐阅读
- android - Android 模拟器:进程以退出代码 -1073741819 (0xC0000005) 完成
- python-3.x - Google Cloud Speech API - Python 中的证书验证失败
- asp.net-mvc - 两个操作的属性路由导致“无效的 OData 路径模板”
- visual-studio - 将 Windows 窗体应用程序发布到 ftp 位置
- python - 在 Python 中通过请求发送 PIL 图像
- python - 记录链接上的重复数据删除溢出错误
- java - Scala - 如何从 Avro 模式中获取所有字段名称?
- handlebars.js - Handlebars:如何为 sum 数组制作自定义助手?
- reactjs - (React Router v4) 使用地图创建路由
- ios - 在 UIStackView UILabel 内部没有文字扭曲到下一行