JS和其他面向对象语言的区别
面向对象是什么?
在开始分清区别之前,我们还是先对面向对象和对象的概念简单梳理一下
对象
现实世界中,随处可见的一种事物就是对象,对象是事物存在的实体,如人类、书桌、计算机、高楼大厦等。人类解决问题的方式总是将复杂的事物简单化,于是就会思考这些对象都是由哪些部分组成的。通常都会将对象划分为两个部分,即动态部分与静态部分。静态部分,顾名思义就是不能动的部分,这个部分被称为"属性",任何对象都会具备其自身属性,如一个人,它包括高矮、胖瘦、性别、年龄等属性。然而具有这些属性的人会执行哪些动作也是一个值得探讨的部分,这个人可以哭泣、微笑、说话、行走,这些是这个人具备的行为(动态部分),人类通过探讨对象的属性和观察对象的行为了解对象。
一句话简述:现实世界里,所有看得见摸得着的物体都是对象,每个对象都拥有自己的属性和行为。
面向对象(Object Oriented,OO)是软件开发方法 (面向对象编程)
面向对象是一种对现实世界理解和抽象的方法,是计算机编程技术发展到一定阶段后的产物。
面向对象的基本思想是使用类, 对象, 继承, 封装, 消息等基本概念进行程序设计.
在系统构造中尽可能的利用人类的自然思维方式,强调以现实世界中的事物(对象)为中心来思考,认识问题,并根据这些事物的本质特征,把它们抽象表示为系统中的类.
这使得软件系统的组件可以直接的映像到客观世界,并保持客观世界中事物及其相互关系的本来面貌.
面向对象方法的三个基本特征:
- 封装性: 将对象的实现细节隐藏起来,通过一些公共的接口方法来供外部调用对象的功能 (体现出了隐藏细节和代码重用这两个特点)
- 继承性: 是面向对象实现的的重要手段,子类继承父类,子类直接获得父类的非private属性和方法 (体现出了代码的重用性和扩展性)
- 多态性: 多态是指多个对象拥有相同的方法但是有不同的实现 (体现出了代码的灵活性)
一句话简述: 面向对象是一种编程思想,就像班规一样,没有实体。整体思想就是把现实世界的物体(以及物体与物体之间的关系)映像到计算机内。
JS也是面向对象语言的一种,但是它在细节实现还是和其他OO类语言有部分区别
Java 是一门面向对象的语言 (基于原型的面向对象语言)
注意括号内:基于原型的面向对象语言
在JS里,你遇到的所有东西几乎都是对象。但是,它又不算一种真正的面向对象编程(OOP)语言,因为它的语法中没有class(类)。面向对象的语言有一个标志,即拥有类的概念 (类就像是一个模板,我们可以通过模板不断的产生新的物体出来)。基于类可以创建任意多个实例对象。但是在JS里,它是没有class(类)的,既然没有类,那么它怎么产生新的对象呢?
首先,我们来看一下基于类的面向对象语言的产生对象方式。基于类的面向对象语言(采用Java来举例)
image可以看到,使用class类作为模板,我们可以采用关键字new用来产生新的对象
JS这种没有class的语言怎么产生对象呢?
实际上,Java 语言是通过一种叫做 原型(prototype)的方式来实现面向对象编程的
对象(object)是依靠 构造器(constructor)利用 原型(prototype)构造出来的
//基于原型的面向对象语言
原型
ECMA 允许通过 构造器(constructor)创建对象。每个构造器实际上是一个 函数(function) 对象。
- 所有的函数都有一个 prototype(显示原型) 属性,这个属性引用了一个对象,即原型对象,也简称原型,每个函数被创建的时候都会有一个prototye属性,这个属性会指向函数的原型对象。
- 所有对象都有 constructor 属性,这个属性指向构造此对象的函数的引用。
- 所有对象都有 proto(隐式原型) 属性(只读),这个属性指向构造此对象函数的原型。
对象可以由"new 关键字 + 构造器调用"的方式来创建(这里需要注意,new和其他语言例:Java的含义不同,下面文章会讲到)
constructor、prototype、proto关系见下图
image image这里要特意说明JS的关键字new
由于早期 Java 的发明者为了使这门语言与大名鼎鼎的 Java 拉上关系 ( 虽然现在大家知道二者是雷锋和雷锋塔的关系 ),使用了 new 关键字来限定构造器调用并创建对象,以使其在语法上跟 Java 创建对象的方式看上去类似。但需要指出的是,这两门语言的 new含义毫无关系,因为其对象构造的机理完全不同。也正是因为这里语法上的类似,众多习惯了类式面向对象语言中对象创建方式的程序员,难以透彻理解 JS 对象原型构造的方式,因为他们总是不明白在 JS 语言中,为什么"函数名可以作为类名"的现象。而实质上,JS 这里仅仅是借用了关键字 new,仅此而已;换句话说,ECMA 完全可以用其它 非new 表达式来用调用构造器创建对象。
结语:JS是基于原型的面向对象语言,没有class(类)。产生对象的方式也与其他OO语言有所不同,采用原型的方式来构造对象。