JavaScript面向对象还是不面向对象,这是个问题。好吧,这就是我们将要在这篇文章中讨论的主题。
我知道,这个话题已经被讨论过太多次了。但是,它总是被不断地提及。每当Java或C#或任何其他OOP语言的开发人员与JavaScript接触时,这些开发人员都会抱怨连连。他们说,用JavaScript工作简直是一团乱,没有类型,结构不合理,有些怪异,对象支持不给力,它绝对不是OOP语言。
其中有一些抱怨可能可以接受,但还有一些则是偏见,例如说JavaScript没有类型因而它不是OOP语言的言论。关于后面一点,在出口论断之前,你应该问自己:是什么使编程语言成为面向对象的编程语言?
什么是OOP?OOP模式没有正式的标准规范。没有一个技术文档定义了什么是OOP,什么不是OOP。OOP定义主要基于早期研究人员,如KristnNygaard,AlanKays,WilliamCook等人发表的论文中的常识。已经有很多人尝试定义OOP以及一个可广泛接受的定义来对编程语言进行分类,因为面向对象基于两个要求:
通过对象建模问题的能力。
支持一些准许模块化和代码重用的原则。
为了满足第一个要求,这种语言必须使开发人员能够使用对象来描述现实并定义对象之间的关系,如下所示:
关联:对象引用另一个独立对象的能力。
聚合:对象嵌入一个或多个独立对象的能力。
组合:对象嵌入一个或多个依赖对象的能力。
通常,如果语言支持以下原则,则能满足第二个要求:
封装:专注于数据和操纵代码的单一实体,并隐藏其内部细节的能力。
继承:一个对象从一个或多个其他对象获取某些或所有要素的机制。
多态:根据数据类型或结构不同地处理对象的能力。
满足这些要求的语言我们通常将其归类为为面向对象的。
JavaScript和OOP所以现在我们知道OOP语言应该是什么样子的了。那么,我们可以证明JavaScript是一种OOP语言吗?咱们试试吧。
我们知道,JavaScript对象支持关联,聚合和组合的能力并不强劲。请看以下代码:
varjohnSmith={firstNam:"John",lastNam:"Smith",addrss:{//Compositionstrt:"DuncannonStrt",city:"London",country:"UnitdKingdom"}};varnickSmith={firstNam:"Nick",lastNam:"Smith",addrss:{//Compositionstrt:"OxfordStrt",city:"London",country:"UnitdKingdom"}};johnSmith.parnt=nickSmith;//Associationvar