【问题标题】:What is a built in object in Javascript? [duplicate]Javascript 中的内置对象是什么? [复制]
【发布时间】:2017-12-31 16:43:50
【问题描述】:

我读到基于对象和面向对象之间的区别之一是前者支持内置对象(例如,Javascript中的窗口对象)。那么,内置对象到底是什么以及为什么它没有像 java 这样的面向对象语言。

【问题讨论】:

  • 它们与静态变量没有特别的区别。
  • 你在哪里读到的?这没有多大意义——JS没有“内置window对象”,它运行的环境可能提供一个。例如,NodeJS 中没有 window
  • 这种区别完全没有意义。 Java 或类似 Java 的语言也可以提供内置对象。
  • 顺便说一句,可以将 Javascript 归类为 面向对象 语言,而将 Java 归类为 面向类 语言。但那是separatequestion
  • 语言或生态系统提供的对象。

标签: javascript


【解决方案1】:

这实际上并不是这两个术语之间的区别。

对于被认为是“面向对象”的编程语言,它必须支持以下四个编程概念:

  1. 继承
  2. 封装
  3. 抽象
  4. 多态性

有许多语言支持这些"four pillars of OOP"(Java、C/C++、C#、JavaScript 等)。

但是,有些语言却没有。一个著名的例子就是我们现在所说的“经典 VB”(.NET 引入之前的 Visual Basic)。该语言可以模拟继承,但该语言中没有内置的实际机制,因此虽然“经典 VB”具有本机对象,但它是一种“基于对象”、“非面向对象”的编程语言,因为它确实支持对象的概念,但并不支持真正的 OOP 语言所需的所有方面。

应该注意的是,许多 OOP 语言都建立在“类”的概念之上,作为从中生成对象的机制。而且,虽然这是一种非常流行的构建对象的方法,但语言不是面向对象的要求。 JavaScript 没有类(尽管有 class 关键字),它有“原型”,它们是实现对象的架构。

您关于“本机”对象的问题与此无关。您很可能在 this Wikipedia page 上读到原生对象与所有这些相关,但该页面上有很多错误,我已对该页面进行了编辑以使其更准确。一种语言是否具有“内置”或“本机”对象与它是面向对象还是基于对象完全无关,因为这两种类型的语言都是以对象为中心的(我自己的术语)。例如,VB 6 是一种基于对象的语言,但支持多种原生对象,而 VB .NET(其后继者)是面向对象的,也支持大量原生对象。

我会告诉你,“本机”对象只是一种直接内置于语言规范本身并且运行时环境可以在内部访问它的对象。在 JavaScript 中,一些示例是 StringDateArrayRegExMathObject 等。请注意,在您的问题中,您提到了 windowwindow不是原生 JavaScript 对象,该对象由托管 JavaScript 运行时的浏览器提供。如果您在 Node.js 中运行 JavaScript,window 将不可用,因为它不是 JavaScript 原生的,并且 Node 不向运行时提供这样的对象。

这里有一些很好的链接,可以用来了解 OOP 概念以及它们在 JavaScript 中的工作原理:

【讨论】:

  • Javascript 不是基于对象的语言吗?并且基于对象的语言不需要支持继承。 en.wikipedia.org/wiki/Object-based_language
  • @sanjeeda 并不是说​​基于对象的语言“不需要”支持继承。基于对象的语言“不”支持所有四个“OOP 支柱”(抽象、封装、多态性、继承)——JavaScript 原生支持所有这些。
【解决方案2】:

window 对象是全局对象。它既不存在于 Java 中,也不存在于 Node.js 的 JavaScript 中,因为它指的是浏览器窗口。

在此处了解所有全局对象:Global Objects (MDN)

如您所见,有很多全局对象。例如,Array 全局对象存在于 Java 和 JavaScript 中。

【讨论】:

    【解决方案3】:

    在像 Java 这样的 OO 语言中有“内置”对象(或者大多数人会这样认为),想想基本的 Object(继承层次结构的顶部)和许多最核心的特性标准库中的东西。

    我的印象是人们会说 JavaScript 中仍然存在 一些 对象,但是您实际上不能像在其他语言中那样声明/创建功能齐全的类。但是,我的意思是 C# 和 Java 中的数组与 JavaScript 中的数组一样是一个对象。

    为了让某人将一种语言称为“面向对象”,我假设它需要类(或类似的构造,Go 中的 struct),这就是为什么您通常不会将 JS 描述为面向对象的原因.也就是说,ES6 中已经添加了类,因此它现在可以说是完全面向对象的,只是使用了弱类型系统。

    【讨论】:

    • " 有人将一种语言称为“面向对象”,我认为它需要类“ 一点也不。请参阅我的回答,了解什么是面向对象的编程语言。无论如何,课程都不是必需的。 JavaScript 没有类,它有原型并且是面向对象的。
    • @ScottMarcus 是的,我读了你的答案。它在技术上比这更准确。尽管我会说即使根据您的标准将 JS 归类为 OO 仍然是一个相当开放的论点。它并没有真正的封装,并且可能不会很快因为范围太松散。
    • 嗯?当然,JavaScript 有封装。在对象中拥有私有数据的能力是封装,当然 JavaScript 也有这种能力。 JavaScript 中的作用域非常灵活,但这并不意味着它不存在。
    • @ScottMarcus 什么是私有的?我可能错了,但我的印象是“私人”的标准不一样。这就像伪封装。你真的能阻止对某个字段的访问吗?你能阻止我修改对象结构/定义吗?
    • @ScottMarcus 这不是类的属性,它是隐藏在闭包/方法中的本地变量。您不能将私有字段附加到该类,因此它没有封装,至少不是您提到的所有传统 OO 语言的定义。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-17
    • 2012-09-04
    • 1970-01-01
    • 2016-01-09
    • 2012-01-22
    • 1970-01-01
    相关资源
    最近更新 更多