js高级-JavaScript的面相对象

161 阅读5分钟

面向对象的理解

要学习和理解JavaScript的面相对象,我们首先要理解面向对象的概念,特性,以及面向对象的优点。
面向对象是区别于函数式编程的另外一种编程方式,在面向对象的编程过程中,函数将不作为我们编程设计思考的要点,而对象则称为们我们编程设计的核心。
在面向对象编程中,我们不再去思考怎么去设计一个个复用性强,健壮性好,功能指责单一的函数来完成我们的功能,而是要思考怎么思考,在我们要实现的功能中,存在哪几种对象,这几种对象之间的关系是怎么样的,我们怎么去设计对象的'原型'(类)才能将功能实现,怎么样去设计类才能使我们的代码即简洁,又富有复用性。

面向对象的三大特性

封装:我们前面将属性和方法封装到一个类中,可以称之为封装的过程
继承:继承是面向对象中非常重要的,不仅仅可以减少重复代码的数量,也是多态前提(纯面向对象中)
多态:不同的对象在执行时表现出不同的形态;

面向对象的优点

1.思考方式更贴近于现实。

面向对象的优点最大的好处,我自认为它使我们编程的思考方式发生了改变,让我们用更接近于现实的思考方式去实现编程。
因为现实中我们看到的一切事物其实都可以看成是一个个的对象,这些对象有自己的属性,有自己的行为。
既然现实社会中就有这样各种各样的对象,我们要实现的功能也是现实社会中的一些功能,我们就能更容易的从这些对象中抽象出我们编程中的各个对象的原型,从而更容易的设计好对应的类,实现对应的功能。

2.代码复用性更强

由面向对象的封装和继承特性,我们可以在代码中更好的复用之前编写过的类的功能,而且由于在编程过程中,我们会一直思考怎么样更好的封装,那么这么封装性强的代码它的复用性一定是很高的。

其他

面向对象的优点有很多,我只是简单的诉说以上两点。

JavaScript 中的面相对象

JavaScript 最初的设计是只是用来提交表单,做一些简单的动态交互的,这种应用场景,其实函数式编程模式足以应付, 后来随着业务越来越复杂,动态效果要求越来越复杂,函数式编程显得有些吃力,JavaScript为了应对这些变化,就支持了面相对象编程,同时还保留着函数式编程的能力。正是由于这样的原因,才使得JavaScript的面相对象看起来有些别扭。

JavaScript 中的面相对象的实现

JavaScript的面相对象是通过原型&原型链&构造函数等等这些概念相互联系来实现的,所以理解起来会有很多疑惑,想要理清楚这其中的原理也会有些无从下手。这里先对整个实现做一个简单的总结,我会在后续的总结文章中,更深入的解释其中的几个概念。
1.每个对象都有它对应的原型。 2.我们通过字面量创建的对象的过程,会转化为new Object()的形式调用完成对象的创建,也就是说字面量创建对象是new Object()创建对象形式的语法糖。
3.new Object()形式创建的对象是调用JavaScript中内置的一个构造函数来完成的,这个函数是Object 构造函数。
4.我们使用new Object()的形式调用一个构造函数时,会发生如下几件事情。
(1)在内存中创建一个新的对象(空对象)。
(2)这个对象中会有默认的几个属性。
[[prototype]]属性:这个属性会被赋值为该构造函数的prototype属性
this:这个属性会指向创建出来的新对象。
[[prototype]]又称为隐式原型,在浏览器中可以通过__proto__的形式访问,但是这个属性存在兼容性问题,因为它是浏览器添加的属性,并非ECMA规定。
(3)调用构造函数,会执行构造函数内部的代码(函数体代码)
(4)如果这个构造函数没有返回非空对象,则这个构造函数会返回创建出来的新对象。
5.所有的函数都有一个prototype的属性,这个属性指这个函数的原型。这种原型称为显式原型。
6.Obeject() 也是一个函数,它指向Object原型。
7.原型有一个constructor属性,指向其对应的构造函数,构造函数的constructor指向其本身。
8.函数也是一个对象,也有对应的隐式原型。\

简单来说,其他面相对象的语言是直接通过类来封装我们抽象的一类事物的属性和行为,而JavaScript 的面相对象是通过原型和构造函数的组合实现了类的功能,在原型中定义共用的方法和对属性的限制性操作,在构造函数中,定义具体对象的属性,并做对应的属性的处理。\

其他面相对象的继承特性通过类继承可以达到子类复用父类的属性和方法,JavaScript 的面相对象则是通过原型继承形成的原型链来实现方法和属性的查找和复用。

截屏2022-05-05 下午2.25.19.png