02月18, 2017

Is JavaScript Object-Based or Object-Oriented

JavaScript 面向对象还是基于对象

关于 JavaScript 究竟是基于对象(Object-Based),还是面向对象(Object-Oriented),这个话题自 JavaScript 诞生以来已经被人们争论了二十多年。在众说纷纭下,我查找了一些资料,整理如下。

Object-Based

The term "object-based language" may be used in a technical sense to describe any programming language that uses the idea of encapsulating state and operations inside "objects" "Object (computer science)"). -wikipedia

对象是一个封装了数据和方法的单元,基于对象编程指的就是在一门编程语言里利用对象的概念来编写程序。显然这是一个很广泛的概念,所有具有对象概念的编程语言都可以进行基于对象的编程。 毫无疑问,JavaScript 里有对象的概念,所以它一定是基于对象的,这一点一般也没有争议。

Object-Oriented

Object-based languages need not support inheritance "Inheritance (computer science)") or subtyping, but those that do are also said to be "object-oriented". Object-based languages that do not support inheritance or subtyping are usually not considered to be true object-oriented languages. -wikipedia

面向对象编程一般认为是基于对象编程的一个子集,也就是说如果一门语言是面向对象的,那它一定得是基于对象的。因为面向对象的要求更严格特殊,于是我们一般以基于对象的编程语言为全集取面向对象的编程语言的补集,把这些语言叫做基于对象的语言。就如虽然正方形是长方形的特殊情况,但我们不把正方形叫做长方形。 所以争议的关键点其实是 JavaScript 到底是不是面向对象的。 问题就出现在这里,面向对象这种编程范式和基于对象并没有明显的界定。维基百科在基于对象的条目中认为面向对象的语言应该符合以下几点要求

  • 面向对象的语言应该支持面向对象编程的所有特性,尤其是继承(inheritance)和子类型化(subtyping)
  • 面向对象的语言不能有内建对象

并且该条目以 JavaScript 有内建对象 window 为由,认为 JavaScript 不是面向对象的语言。而 window 对象其实是浏览器的内建对象而不是 JavaScript 标准要求的,例如 Node 里就没有内建 window 对象(但同样有类似的内建对象 global ),所以我认为这个理由并不能令人信服。

ECMAScript

4 Overview
ECMAScript is an object‑oriented programming language for performing computations and manipulating computational objects within a host environment.
4.2 ECMAScript Overview
ECMAScript is object‑based: basic language and host facilities are provided by objects, and an ECMAScript program is a cluster of communicating objects.

ECMAScript 是当前 JavaScript 的标准,其中明确指出 ECMAScript 是一门基于对象并且面向对象的编程语言。

JS is a prototype-based, multi-paradigm, dynamic scripting language, supporting object-oriented, imperative, and declarative (e.g. functional programming) styles.
Prototype-based programming is a style of object-oriented programming in which behaviour reuse (known as inheritance "Inheritance (programming)")) is performed via a process of reusing existing objects "Object (programming)") via delegation that serve as prototypes.
JavaScript 是基于原型继承的语言,属于面向对象编程语言的一种。
Javascript是一种基于对象(object-based)的语言,你遇到的所有东西几乎都是对象。但是,它又不是一种真正的面向对象编程(OOP)语言,因为它的语法中没有class(类)。

很多人以 JavaScript 没有 class(类)为由认为它不是面向对象编程语言。我认为这也是不正确的。
There is significant diversity of OOP languages, but the most popular ones are class-based, meaning that objects are instances "Instance (computer science)") of classes "Class (computer science)"), which typically also determine their type.

综上所述,我个人认为 JavaScript 是面向对象的更是基于对象的,其实这两个概念本身的模糊造成了人们的争论。这种争论并不是很有意义,毕竟我们都熟悉 JavaScript 的编程方式,而这些概念只不过是一个说法定义而已。

本文链接:https://sxing.xyz/post/is-javascript-object-based-or-object-oriented.html

-- EOF --

Comments

评论加载中...

注:如果长时间无法加载,请针对 disq.us | disquscdn.com | disqus.com 启用代理。