javaScript面向对象的三个基本特征介绍

article/2025/1/18 21:10:18

了解过面向对象的同学应该都知道,面向对象三个基本特征是:封装、继承、多态,但是对于这三个词具体可能不太了解。对于前端来讲接触最多的可能就是封装继承,对于多态来说可能就不是那么了解了。

封装

在说封装之先了解一下封装到底是什么?

什么是封装

封装:将对象运行所需的资源封装在程序对象中——基本上,是方法和数据。对象是“公布其接口”。其他附加到这些接口上的对象不需要关心对象实现的方法即可使用这个对象。这个概念就是“不要告诉我你是怎么做的,只要做就可以了。”对象可以看作是一个自我包含的原子。对象接口包括了公共的方法和初始化数据。(节选自百度百科)

我对于封装的理解,可能还有一个步骤就是抽离,首先你要清楚在一个对代码中你应该抽离那些属性方法,有了这些为基础才能更好的做好封装。

封装无非就是其属性和方法封装。

  1. 类:封装对象的属性和行为

  2. 方法:封装具体逻辑功能

  3. 访问封装:访问修饰封装无非就是对其访问权限进行封装

class Employees {constructor(name,age){this.name = name;this.age = age;}getInfo(){let {name,age} = this;return {name,age};}static seyHi(){console.log("Hi");   }
}let lisi = new Employees("Aaron",18);
lisi.seyHi();   // lisi.seyHi is not a function
lisi.getInfo();  // {name: "Aaron", age: 18}
Employees.seyHi();  // Hi

Employees中抽出的公共属性有name,age,公共方法有getInfo,seyHi,然而getInfoseyHi所不同的是seyHi使用了static修饰符,改变其为静态方法,seyHi只属于Employees这个类。然而getInfo方法则是属于实例的。

这里使用了staticseyHi方法对其进行了访问权限的封装。

再举一个例子。

Promise.then()  //  Promise.then is not a function
let p1 = new Promise(() => {})
p1.then();  //  Promise {<pending>}
Promise.all([1]);   //  Promise {<resolved>: Array(1)}

从上面的代码中可以看出Promise也使用了static对其方法的访问权限进行了封装。

继承

继承:说到继承并不太陌生,继承可以使得子类具有父类的各种的公有属性和公有方法。而不需要再次编写相同的代码。在令子类别继承父类别的同时,可以重新定义某些属性,并重写某些方法,即覆盖父类别的原有属性和方法,使其获得与父类别不同的功能。(节选自百度百科)

子类继承父类后,子类具有父类属性和方法,然而也同样具备自己所独有的属性和方法,也就是说,子类的功能要比父类多或相同,不会比父类少。

class Employees {constructor(name){this.name = name;}getName(){console.log(this.name)}static seyHi(){console.log("Hi");   }
}
class Java extends Employees{constructor(name){super(name);}work(){console.log("做后台工作");}
}
let java = new Java("Aaron");
java.getName();
java.work();
// java.seyHi();    //  java.seyHi is not a function

从上面的例子可以看出继承不会继承父类的静态方法,只会继承父类的公有属性与方法。这一点需要注意。

子类继承之后既拥有了getName方法,同样也拥有自己的worker方法。

多态

多态:按字面的意思就是“多种状态”,允许将子类类型的指针赋值给父类类型的指针。(节选自百度百科)

说白了多态就是相同的事物,调用其相同的方法,参数也相同时,但表现的行为却不同。多态分为两种,一种是行为多态与对象的多态。

多态的表现形式重写与重载。

什么是重写

重写:子类可继承父类中的方法,而不需要重新编写相同的方法。但有时子类并不想原封不动地继承父类的方法,而是想作一定的修改,这就需要采用方法的重写。方法重写又称方法覆盖。(节选自百度百科)

class Employees {constructor(name){this.name = name;}seyHello(){console.log("Hello")}getName(){console.log(this.name);}
}
class Java extends Employees{constructor(name){super(name);}seyHello(){console.log(`Hello,我的名字是${this.name},我是做Java工作的。`)}
}
const employees = new Employees("Aaron");
const java = new Java("Leo");
employees.seyHello();   //  Hello
java.seyHello();    //  Hello,我的名字是Leo,我是做Java工作的。
employees.getName();    //  Aaron
java.getName(); //  Leo

通过上面的代码可以看出Java继承了Employees,然而子类与父类中都存在seyHello方法,为了满足不同的需求子类继承父类之后重写了seyHello方法。所以在调用的时候会得到不同的结果。既然子类继承了父类,子类也同样拥有父类的getName方法。

什么是重载

重载就是函数或者方法有相同的名称,但是参数列表不相同的情形,这样的同名不同参数的函数或者方法之间,互相称之为重载函数或者方法。(节选自百度百科)

class Employees {constructor(arg){let obj = null;switch(typeof arg){case "string":obj = new StringEmployees(arg);break;case "object":obj = new ObjEmployees(ObjEmployees);break;case "number":obj = new NumberEmployees(ObjEmployees);break;}return obj;}
}
class ObjEmployees {constructor(arg){console.log("ObjEmployees")}
}
class StringEmployees {constructor(arg){console.log("StringEmployees")}
}
class NumberEmployees {constructor(arg){console.log("NumberEmployees")}
}
new Employees({})   // ObjEmployees
new Employees("123456") //  StringEmployees
new Employees(987654)   //  NumberEmployees

因为JavaScript是没有重载的概念的所以要自己编写逻辑完成重载。

在上面的代码中定义了Employees,ObjEmployees,StringEmployees,NumberEmployees类,在实例化Employees的时候在constructor里面进行了判断,根据参数的不同返回不同的对应的类。

这样完成了一个简单的类重载。

总结

  1. 封装可以隐藏实现细节,使得代码模块化;

  2. 继承可以扩展已存在的代码模块(类),它们的目的都是为了——代码重用。

  3. 多态就是相同的事物,调用其相同的方法,参数也相同时,但表现的行为却不同。多态分为两种,一种是行为多态与对象的多态。

在编程的是多多运用这个写思想对其编程时很有用的,能够使你的代码达到高复用以及可维护。

相关免费学习推荐:js视频教程


http://chatgpt.dhexx.cn/article/eYZxeMvV.shtml

相关文章

javascript面向对象的三大特性

面向过程和面向对象 区别 面向过程&#xff1a;关注的是过程 中的每一个环节 吃蛋炒饭&#xff1a;买鸡蛋→买米→蒸米→炒蛋→炒米→混合→搅拌→蛋炒饭 面向对象&#xff1a;关注的是让对象 做事情 找一个对象&#xff08;老公或老婆&#xff09;.做蛋炒饭 面向对象编程 …

JS面向对象的三大特性简述

1.语法 1.1 对象的声明语法 1.1.1通过字面量方式新建对象 var obj {}var obj1 {name: hhupp,call: function() {console.log(CALL)}}console.log(obj, obj)console.log(obj1, obj1)obj1.call() 1.1.2通过new关键词新建对象&#xff08;不推荐--和通过字面量方式新建对象并无…

一个小实验告诉你,内存速度到底比硬盘快多少!!!

近期在Linux下做了一个小实验&#xff0c;亲身体会了内存的速度到底比硬盘快多少。 实验步骤如下&#xff1a; 1. df #查看磁盘信息 2. dd if/dev/zero of /dev/shm/file bs1M count3000 3. dd if/dev/zero of/mnt/file bs1M count3000由此可见&#xff0c;内存的读取速…

硬盘和内存的速度

1. 简介 随着电子技术的发展&#xff0c;内存和硬盘的速度都在提高&#xff0c;但同时&#xff0c;旧技术因为应用场景依然存在&#xff0c;速度上有个大致的理解上有必要的。 2. 内存的速度 3. 存储介质的速度 操作平台 读 写 NVME PCIE SSD(gen3 4x) 2.1 GB/s 1.2 GB/s…

CPU、寄存器、内存、磁盘、网络性能分析

介绍 寄存器 最靠近 CPU 的控制单元和逻辑计算单元的存储器&#xff0c;就是寄存器了&#xff0c;它使用的材料速度也是最快的&#xff0c;因此价格也是最贵的&#xff0c;那么数量不能很多。 存储器的数量通常在几十到几百之间&#xff0c;每个寄存器可以用来存储一定的字节…

《手机网速、CPU、内存和闪存》的速度制衡之道

一、手机网速、CPU、内存与闪存的速度制衡之道&#xff1a; 手机响应速度的快慢很大程度上是多方面因素共同作用的结果&#xff0c;例如高性能的处理器、快速的内存和闪存标准、良好的网络链接性能、优化完善的操作系统等等&#xff0c;这就是Iphone手机的流畅体验要远远好于大…

类比 -高速缓存Cache/内存/磁盘读写速度类比

1、计算机设备、组件数据传输速度类比 计算机设备、组件读类比机械硬盘0.1G/S蜗牛量级&#xff08;60m/h&#xff09; &#xff0c; 以机械盘为基准固态盘1.3G/S龟速量级&#xff08;780m/h&#xff09;&#xff0c;13倍机械硬盘内存30G/S跑步量级&#xff08;23.4km/h&#x…

内存的速度和CPU缓存速度比较

转载于&#xff1a;https://blog.csdn.net/moyeshuier/article/details/103943355 这之前&#xff0c;我必须先讲一下cpu cache 内存三个组件在运行程序时候的关联&#xff0c;有了这个基础我后面才能讲锁。 那今天讲的是缓存一致性&#xff0c;首先要理解我说的缓存是什么意思…

计算机内存加速,电脑内存运行速度如何提升

电脑内存运行速度如何提升是一个经常提到的话题,需要了解一些基本的电脑知识来处理,下面学习啦小编介绍内存升级提高电脑运行速度的办法。 电脑内存运行速度提升方法 1.调整高速缓存区域的大小。所谓高速缓存,是指系统在读取磁盘、光盘上的数据时,采取“预读取”技术,也 就…

GPU 内存结构

GPU 和CPU通过 VLink 或者PCLe 相连。 每个SM 又含有多个cuda core&#xff0c;多个SM共享全局内存&#xff0c;通过L2 高速缓存和全局内存进行相连&#xff0c;不同代的GPU之间的体系结构有所不同。 右边是一个SM 上的 内存&#xff0c;有共享内存&#xff0c;局部内存&…

计算机专业电脑内存,电脑内存大小是否和速度有关?

我们总觉得内存大一点,就是运行速度一定是快。现在市面上的电脑,配置已经很强大了,动不动内存就上12G、16G的笔记本、一体机电脑随处可见。电脑已经到了瓶颈且性能过剩的年代,其实内存越大就代表电脑速度越快,这里有些误区,今天就让小编跟大家说说内存这点事儿。 计算机运…

linux怎么看内存时序,内存速度和时序重要么

描述 最近是跟内存耗上了,其一是手里没有其它硬件可测,更重要的是想趁着这段时间,把内存与性能之间的影响都慢慢测一下。今天测的就是时序与内存性能之间的关系了。时序很重要吗?答案是肯定的,但是时序对内存性能的影响到底有多大呢?下面就详细的测试一下。 用来测试的内…

手机测试内存速度的软件,如何查看手机内存速度?手机内存读取速度测试_手机内存速度多少算正常...

如何查看手机内存速度&#xff1f;手机内存速度多少算正常&#xff1f;下面小编就给大家介绍下手机内存读取速度测试发方法&#xff01; 今早&#xff0c;手机内存问题再度引起热潮&#xff0c;很多朋友都在讨论手机内存速度问题。那么问题来了&#xff0c;如何正确测试自己手机…

双倍数据率同步動態隨機存取記憶體(英語:,簡稱DDR SDRAM)

双倍数据率同步動態隨機存取記憶體&#xff08;英語&#xff1a;&#xff0c;簡稱DDR SDRAM&#xff09;為具有雙倍資料傳輸率的SDRAM&#xff0c;其資料傳輸速度為系統時脈的兩倍&#xff0c;由於速度增加&#xff0c;其傳輸效能優於傳統的SDRAM。 DDR SDRAM 研發商SamsungJED…

古风排版java_古风排版java版-Go语言中文社区

7-7 古风排版(20 分) 中国的古人写文字&#xff0c;是从右向左竖向排版的。本题就请你编写程序&#xff0c;把一段文字按古风排版。 输入格式&#xff1a; 输入在第一行给出一个正整数N(<100)&#xff0c;是每一列的字符数。第二行给出一个长度不超过1000的非空字符串&#…

古风排版问题

7-7 古风排版 中国的古人写文字&#xff0c;是从右向左竖向排版的。本题就请你编写程序&#xff0c;把一段文字按古风排版。 输入格式&#xff1a; 输入在第一行给出一个正整数N&#xff08;<100&#xff09;&#xff0c;是每一列的字符数。第二行给出一个长度不超过1000…

古风排版 (

中国的古人写文字&#xff0c;是从右向左竖向排版的。本题就请你编写程序&#xff0c;把一段文字按古风排版。 输入格式 输入在第一行给出一个正整数 NN&#xff0c;是每一列的字符数。第二行给出一个长度不超过 10001000 的非空字符串&#xff0c;以回车结束。 输出格式 按…

开源中文古风排版样式,简约美观,超级好用!

只推荐用过的好用工具&#xff0c;关注DD帮你提高效率 如果有一篇古诗&#xff0c;要放在Web页面上&#xff0c;你会如何排版呢&#xff1f;如果要实现类似语文书中的那种效果&#xff0c;有没有办法快速实现呢&#xff1f; 今天给大家推荐一个非常好用的开源项目&#xff0c;就…

微分和导数的关系是什么?

在初学微分和导数时&#xff0c;虽然感觉概念不复杂&#xff0c;但是我对两者的关系有点模糊&#xff0c;比如以下问题就觉得模棱两可&#xff1a; 对于导数链式法则&#xff0c; d y d x d y d u d u d x \frac {dy}{dx} \frac {dy}{du} \frac {du}{dx} dxdy​dudy​dxdu​…