JS语言是不是面向对象的?(一)
我计划要写两篇文章。第一篇,阐述JS语言是不是面向对象的,和JS是否支持工程模块化;第二篇,讲一种阅读React源码项目的技术。
第一篇,阐述的步骤
- 1 为什么要面向对象,
- 2 面向对象的标准特征是什么,
- 3 JS有没有,以及如何实现这个特征。
同样,
- 1 为啥要模块化,
- 2 什么是模块化,
- 3 以及JS如何做的
JS语言是不是面向对象的?
1 任何语言都是用来构造具有计算功能的【程序】,有【构造程序】的功能,但不一定要支持OO构造法;
2 编程语言具有【构造程序】的工具属性或特性,这个工具特性主要取决于语言的设计,设计【针对何种程序】,例如针对 底层系统程序的 C语言就不支持OO构造法;
3 JS针对开发面向个人用户的交互应用而设计的,这是一种事务处理集中型程序,相对于科学计算程序;
4 事务处理集中型程序规模大,代码重复率很高,所以JS被公认是支持OO构造法,只是OO理论本身的不成熟,JS在何种标准和程度上支持OO,没有比较严格的定论;
5 我认为OO构造法的根本,第一,是支持【专业计算功能】的封装,就是语言支持 【对象】的构件;第二,语言支持类继承等,能对相似对象(行为)进行抽象,归纳得个通用的对象,就是语言【抽象基类】;
6 【对象】的计算功能封装,是软件工程的协作基础;【抽象基类】则在分割大型程序功能,增加一层技术;
7 JS灵活的对象技术,和特殊的原型继承,完全满足以上两个标准;
JS是否支持工程模块化?
1 JS 支持OO构造法,程序可以由一个个的【对象】组成,对象本身就具有【模块】特征;然,【对象】只是功能开发层面的概念,不是工程协作层面的概念;
2 程序的功能单元——【对象】是逻辑的,而不是物理的,【工程模块】应该具有物理性,方便工程协作,包括项目内分工,和社区内分享;
3 JS 有物理的.js文件,然不规定.js的形式,.js文件内容是任意的,所以JS语言(至少ES6前)本身并没有模块化功能
4 JS 应用程序规模的增长,导致了模块化任务的需要,前ES6的JS,社区也用了多种基础技术实现了工程模块化(一种技术他用的技巧);
5 例如,使用对象技术,实现 名字空间模式,和模块模式;
6 还有一些业界实践模块化标准(非语言标准),例如CommonJS
7 ES Module
### 程序模块,与程序功能对象
~
### 模块的形式
模块就是为了提供计算功能的,所以模块必有对外公开的接口(export);然,模块可能有基础依赖,所以可选的有引入依赖(import);
### ES6 module
The ES6 module standard has two parts:
Declarative syntax (for importing and exporting)
Programmatic loader API: to configure how modules are loaded and to conditionally load modules
### 所谓 模块系统
早前的研究《JavaScript程序模块化及模块系统》