JavaScript面向对象还是非面向对象,这是个问题。好吧,这就是我们将在本文中讨论的内容。我知道,这个话题已经讨论了太多次了。然而,它总是被一遍又一遍地提及。每当Java或C#或任何其他OOP语言的开发人员接触JavaScript时,这些开发人员都会抱怨。他们说在JavaScript中工作是一团糟,它没有类型,结构不良,很奇怪,它不能很好地支持对象,而且它绝对不是一种OOP语言。其中一些抱怨可能是可以接受的,但其他一些是有偏见的,例如声称JavaScript没有类型,因此不是OOP语言。关于后一点,在您下断言之前,您应该问问自己:什么使编程语言成为面向对象的编程语言?什么是面向对象编程?OOP模式没有正式的标准规范。没有一个技术文档可以定义什么是OOP,什么不是OOP。OOP定义主要基于KristenNygaard、AlanKays、WilliamCook等早期研究人员发表的论文中的常识。已经有很多尝试来定义OOP和一个被广泛接受的定义来对编程语言进行分类,因为面向对象基于两个要求:通过对象对问题建模的能力。支持一些允许模块化和代码重用的原则。为了满足第一个要求,这样的语言必须使开发人员能够使用对象来描述现实并定义对象之间的关系,如下所示:关联:一个对象引用另一个独立对象的能力。聚合:一个对象嵌入一个或多个独立对象的能力。组合:一个对象嵌入一个或多个依赖对象的能力。一般而言,如果语言支持以下原则,则满足第二个要求:封装:能够专注于数据和操作代码的单个实体,并隐藏其内部细节。继承:对象从一个或多个其他对象获取部分或全部元素的机制。多态性:根据数据类型或结构以不同方式处理对象的能力。满足这些要求的语言通常被归类为面向对象。JavaScript和OOP现在我们知道OOP语言应该是什么样子了。那么,我们能否证明JavaScript是一门OOP语言呢?咱们试试吧。我们知道JavaScript对象对关联、聚合和组合的支持不是很好。请看下面的代码:varjohnSmith={firstName:"John",lastName:"Smith",address:{//Compositionstreet:"123DuncannonStreet",city:"London",country:"UnitedKingdom"}};varnickSmith={firstName:"Nick",lastName:"Smith",address:{//Compositionstreet:"321OxfordStreet",city:"London",country:"UnitedKingdom"}};johnSmith.parent=nickSmith;//Associationvarcompany={name:"ACMEInc.",employees:[]};//聚合company.employees.push(johnSmith);company.employees.push(nickSmith);在上面的代码中,您可以找到组合示例(地址属性)、关联示例(父属性)和聚合示例(员工属性)。至于封装,JavaScript对象是支持数据和功能的实体,但它们没有高级原生支持来隐藏内部细节。JavaScript对象不关心隐私。如果不小心,所有属性和方法都可以公开访问。但是,我们可以应用多种技术来定义对象的内部状态并保护它免受外部访问:使用getter和setter来利用闭包。JavaScript通过所谓的原型继承支持基本级别的继承。尽管一些开发人员认为它有点简单,但JavaScript的继承机制是完全有效的,并且允许您获得与大多数公认的OOP语言相同的结果。不管你怎么说,JavaScript有一种机制,“一个对象从一个或多个其他对象获取它的部分或全部功能”,这就是继承。多态性的挑战似乎更加困难,因为许多人将这个概念与数据类型联系在一起。事实上,多态性涉及编程语言的许多方面,而不仅仅是OOP语言。通常它涉及泛型、重载和结构子类型化等项目。对于一种“简单”且弱类型的语言——JavaScript,所有这些似乎都难以承受。然而,事实并非如此:在JavaScript中,我们可以通过几种方式来实现不同类型的多态性,也许我们已经做了很多次而不自知。没有类的OOP“好吧,但是话又说回来,JavaScript没有类。”许多开发人员认为JavaScript缺少类的概念,并且没有将JavaScript视为真正的面向对象语言,因为它不强制遵守OOP原则。但是,我们可以看到,在非正式定义中,并没有明确提到类。诚然,对象需要属性和原则。但是类并不是真正的要求,它们有时只是一种方便的方式来抽象具有共同属性的对象集合。因此,一种语言可以是一种面向对象的语言,例如JavaScript,即使它的支持对象没有类。此外,OOP原则的目的旨在得到支持。对于用一种语言编程,OOP原则不应该是强制性的。开发人员可以选择使用允许他创建面向对象代码的结构,也可以不使用。许多人批评JavaScript,因为开发人员可以编写违反OOP原则的代码。但这只是程序员的选择,而不是语言的限制。其他编程语言也会发生这种情况,例如C++。因此,我们可以得出结论,缺少抽象类以及允许开发人员自由使用或不使用支持OOP原则的特性并不是将JavaScript视为一种OOP语言的真正障碍。
