我读到基于对象和面向对象之间的区别之一是前者支持内置对象(例如,Javascript中的窗口对象)。那么,内置对象到底是什么以及为什么呢不像java那样面向对象语言。
答案 0 :(得分:2)
这实际上并不是这两个术语之间的区别。
要使编程语言被视为“面向对象”,它必须支持以下四种编程概念:
有许多语言支持这些 "four pillars of OOP" (Java,C / C ++,C#,JavaScript等)。
但有些语言却没有。一个着名的例子是我们现在称之为“经典VB”(Visual Basic在引入.NET之前)。这种语言可以模拟继承,但是没有为它构建语言的实际机制,所以虽然“经典VB”有本机对象,但它是一种“基于对象”,“不是面向对象”的编程语言,因为它确实如此。支持对象的概念,但不支持真正的OOP语言所需的所有方面。
应该注意的是,许多OOP语言都建立在“类”的概念之上,作为从中生成对象的机制。而且,虽然这是一种非常流行的构建对象的方法,但并不要求语言是OO。 JavaScript没有类(尽管有一个class
关键字),它有“原型”,它们是实现对象的体系结构。
关于“原生”对象的问题与此无关。您很可能在 this Wikipedia page 时读到本机对象与所有这些内容相关,但该页面上有很多错误,我编辑该页面更准确。语言是否具有“内置”或“本机”对象与它是面向对象还是基于对象完全无关,因为这两种语言都是以对象为中心的(我自己的术语)。例如,VB 6是一种基于对象的语言,但支持大量本机对象,而VB .NET(其后继者)是面向对象的,并且还支持大量本机对象。
我将告诉您,“本机”对象只是内置于语言规范本身的对象,运行时环境可以在内部访问它。在JavaScript中,一些示例包括String
,Date
,Array
,RegEx
,Math
,Object
等。请注意,在您提到的问题window
,window
不是本机JavaScript对象,该对象由承载JavaScript运行时的浏览器提供。如果您在Node.js中运行JavaScript,则window
将不可用,因为它不是JavaScript本机的,并且Node不向运行时提供此类对象。
以下是一些很好的链接,可以帮助您了解OOP概念及其在JavaScript中的工作原理:
答案 1 :(得分:0)
window
对象是 全局对象。它既不存在于Java中,也不存在于Node.js的JavaScript中,因为它引用了浏览器窗口。
在此处阅读所有全球对象:Global Objects (MDN)
如您所见,有许多全局对象。例如,Array
全局对象存在于Java和JavaScript中。
答案 2 :(得分:0)
在Java等OO语言中有“内置”对象(或者大多数人会认为是这样),只需考虑基础Object
(继承层次结构的顶部)和许多最核心的功能标准库中的东西。
我的印象是,人们会说要指出JavaScript中仍然存在一些对象,但是你实际上无法像其他语言一样声明/创建一个完整的特色类。但是,我的意思是C#和Java中的数组与JavaScript中的数组一样多。
为了让某人将某种语言称为“面向对象”,我认为它需要类(或Go中的类似构造,struct
),这就是为什么你通常不会将JS描述为面向对象。也就是说,ES6中已经添加了类,因此它可以说是完全面向对象的,只是弱类型系统。