源码干货

JS和其他面向对象语言的区别

2018-12-04  本文已影响0人  源码时代官方

面向对象是什么?

在开始分清区别之前,我们还是先对面向对象和对象的概念简单梳理一下

对象

现实世界中,随处可见的一种事物就是对象,对象是事物存在的实体,如人类、书桌、计算机、高楼大厦等。人类解决问题的方式总是将复杂的事物简单化,于是就会思考这些对象都是由哪些部分组成的。通常都会将对象划分为两个部分,即动态部分与静态部分。静态部分,顾名思义就是不能动的部分,这个部分被称为"属性",任何对象都会具备其自身属性,如一个人,它包括高矮、胖瘦、性别、年龄等属性。然而具有这些属性的人会执行哪些动作也是一个值得探讨的部分,这个人可以哭泣、微笑、说话、行走,这些是这个人具备的行为(动态部分),人类通过探讨对象的属性和观察对象的行为了解对象。

一句话简述:现实世界里,所有看得见摸得着的物体都是对象,每个对象都拥有自己的属性和行为。

面向对象(Object Oriented,OO)是软件开发方法 (面向对象编程)

面向对象是一种对现实世界理解和抽象的方法,是计算机编程技术发展到一定阶段后的产物。

面向对象的基本思想是使用类, 对象, 继承, 封装, 消息等基本概念进行程序设计.

在系统构造中尽可能的利用人类的自然思维方式,强调以现实世界中的事物(对象)为中心来思考,认识问题,并根据这些事物的本质特征,把它们抽象表示为系统中的类.

这使得软件系统的组件可以直接的映像到客观世界,并保持客观世界中事物及其相互关系的本来面貌.

面向对象方法的三个基本特征:

一句话简述: 面向对象是一种编程思想,就像班规一样,没有实体。整体思想就是把现实世界的物体(以及物体与物体之间的关系)映像到计算机内。

JS也是面向对象语言的一种,但是它在细节实现还是和其他OO类语言有部分区别

Java 是一门面向对象的语言 (基于原型的面向对象语言)

注意括号内:基于原型的面向对象语言

在JS里,你遇到的所有东西几乎都是对象。但是,它又不算一种真正的面向对象编程(OOP)语言,因为它的语法中没有class(类)。面向对象的语言有一个标志,即拥有类的概念 (类就像是一个模板,我们可以通过模板不断的产生新的物体出来)。基于类可以创建任意多个实例对象。但是在JS里,它是没有class(类)的,既然没有类,那么它怎么产生新的对象呢?

首先,我们来看一下基于类的面向对象语言的产生对象方式。基于类的面向对象语言(采用Java来举例)

image

可以看到,使用class类作为模板,我们可以采用关键字new用来产生新的对象

JS这种没有class的语言怎么产生对象呢?

实际上,Java 语言是通过一种叫做 原型(prototype)的方式来实现面向对象编程的

对象(object)是依靠 构造器(constructor)利用 原型(prototype)构造出来的

//基于原型的面向对象语言

原型

ECMA 允许通过 构造器(constructor)创建对象。每个构造器实际上是一个 函数(function) 对象。

对象可以由"new 关键字 + 构造器调用"的方式来创建(这里需要注意,new和其他语言例:Java的含义不同,下面文章会讲到)

constructor、prototype、proto关系见下图

image image

这里要特意说明JS的关键字new

由于早期 Java 的发明者为了使这门语言与大名鼎鼎的 Java 拉上关系 ( 虽然现在大家知道二者是雷锋和雷锋塔的关系 ),使用了 new 关键字来限定构造器调用并创建对象,以使其在语法上跟 Java 创建对象的方式看上去类似。但需要指出的是,这两门语言的 new含义毫无关系,因为其对象构造的机理完全不同。也正是因为这里语法上的类似,众多习惯了类式面向对象语言中对象创建方式的程序员,难以透彻理解 JS 对象原型构造的方式,因为他们总是不明白在 JS 语言中,为什么"函数名可以作为类名"的现象。而实质上,JS 这里仅仅是借用了关键字 new,仅此而已;换句话说,ECMA 完全可以用其它 非new 表达式来用调用构造器创建对象。

结语:JS是基于原型的面向对象语言,没有class(类)。产生对象的方式也与其他OO语言有所不同,采用原型的方式来构造对象。

上一篇下一篇

猜你喜欢

热点阅读