【问题标题】:JavaScript function/object structure is unclear to me [closed]我不清楚JavaScript函数/对象结构[关闭]
【发布时间】:2019-11-28 15:28:57
【问题描述】:

所以,我开始学习 JavaScript,以便为一些 ClojureScript 和 React 做好准备。我检查了许多描述,包括

...我仍然不确定函数/对象概念的结构。我意识到 JavaScript 没有像 Java 这样的“经典”类型系统,但实际上是 Scheme 和尖锐的 {} 语法。还是……

描述中有一些模糊的词使用(我们有 types(嗯?),classes(hmm...),instances em>、继承对象原型函数构造函数methods) ... 都使用得非常流畅。甚至偶尔会有 kind 被大肆宣传,这种语言实际上并没有一阶类型。

抛开实际的 JavaScript“类”,如果我理解正确的话,它们是语法糖化的对象,带有一些额外的东西:

  • 对象,也有函数,它们被实例化为实例。 (我不确定对象和函数的真正区别是什么;它是实例树的根吗?)
  • 对象实例(图中蓝色)通过“原型”关系(这是“内部”,因此被隐藏)形成一棵树。树根是实例Object.prototype
  • 有一个全局对象Object,也称为“对象构造函数”。它具有对(未命名的对象)Object.prototype(也称为对象原型对象)的可见“原型”引用。
    • 我不确定全局对象Object 是否确实是一个函数。它应该是。它是否有对Function.prototype 的内部引用?
  • 函数实例(图中的绿色)同样通过“原型”关系形成一棵树。树根是实例Function.prototype
    • 但也许它们不会形成树,只是一个层次结构。函数实例拥有原型链到底意味着什么?
  • 有一个全局对象Function,也称为“函数构造函数”。它有一个对(未命名的对象)Function.prototype(也称为函数原型对象)的可见“原型”引用。
    • 如果我正确地解释了this textFunction.prototype 拥有像Function.prototype.lengthFunction.prototype.name 这样的值,它们只对特定函数有意义。是什么赋予了?函数实例是否会影响 Function.protoype 的所有相关值?
  • 每个函数实例都引用其创建上下文及其代码(黄色)
  • 最后,函数实例显然通过其“原型”值具有关联的原型。相反,该实例通过“构造函数”值引用回函数实例。不知道那是做什么的。

除了“课程”之类的额外内容,我是否遗漏了一些东西。这是完全错误的吗?需要纠正什么?

【问题讨论】:

  • 一篇文章中有这么多问题。你至少要分开。
  • 要是我有几个小时来回答这个问题就好了……

标签: javascript function object javascript-objects


【解决方案1】:

你谈论的一切都是一个对象:它有一个身份(在 OOP 意义上),它可以被变异。 (对象旁边的另一种值是原语,它们是不可变的非引用值)。

对象具有属性(键值对,其中键是符号或字符串)和一些内部机制。这个机制的一部分是它的原型链接,可通过Object.getPrototypeOf 访问,指向一个对象或null,对象可以从中继承属性。

函数是具有扩展内部机制的对象,使它们可以调用。 (引用代码和上下文是其中的一部分,但在这里并不重要)。

所有这些对象不一定是任何事物的“实例”,它们可以作为对象创建并存在。

对象不会形成树。原型链接引用具有另一个原型链接的对象,依此类推,形成原型链。当然,从同一个对象继承的多个对象形成了一个树状结构,但与树不同的是,孩子们引用他们的父母而不是相反。此外,没有根节点,任何对象都可以链接null,并且不能从任何东西继承——所以它充其量更像是一片森林。

这就是你需要了解的关于 JS 中对象结构的内容。我不打算扩展构造函数,它们的名称为prototype 的属性,以及它们如何通过继承形成具有“实例”的类结构。您可以找到有关该模式的详细信息,以及它如何应用于内置的ObjectFunction 层次结构elsewhere

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-20
    • 2014-11-08
    • 1970-01-01
    • 1970-01-01
    • 2010-11-18
    • 1970-01-01
    相关资源
    最近更新 更多