学过面向对象的同学应该都知道,面向对象的三个基本特征是:封装、继承、多态,但对这些可能了解不多三个词。对于前端来说,接触最多的可能就是封装和继承,而多态可能不是那么了解。封装在说封装之前,先了解一下什么是封装?什么是封装封装:在程序对象中封装对象运行所需的资源——基本上是方法和数据。一个对象正在“发布它的接口”。附加到这些接口的其他对象可以使用这个对象而不用关心对象实现的方法。这个概念是“不要告诉我你是怎么做的,只要去做”。一个对象可以被认为是一个独立的原子。对象接口包括公共方法和初始化数据。(摘自百度百科)在我对封装的理解中,可能还有一个步骤就是脱离。首先,你需要清楚在一对代码中应该分离哪些属性和方法。有了这些作为基础,就可以更好的做封装了。封装无非就是对其属性和方法进行封装。类:封装对象的属性和行为方法:封装具体的逻辑功能访问封装:访问修改封装无非就是封装它的访问权限classEmployees{constructor(name,age){this.name=name;this.age=age;}getInfo(){let{name,age}=this;return{name,age};}staticseyHi(){console.log("Hi");}}letlisi=newEmployees("Aaron",18);lisi.seyHi();//lisi.seyHiisnotafunctionlisi.getInfo();//{name:"Aaron",age:18}Employees.seyHi();//Hi在Employees中提取的公共属性包括name,age,和public方法有getInfo、seyHi,但是getInfo和seyHi的区别在于seyHi使用了static修饰符,改成了静态方法,而seyHi只属于Employees类。但是,getInfo方法属于实例。这里使用static来封装seyHi方法的访问权限。再举个例子。Promise.then()//Promise.thenisnotafunctionletp1=newPromise(()=>{})p1.then();//Promise{}Promise.all([1]);//Promise{:Array(1)}从上面的代码我们可以看出,Promise也是使用static来封装其方法的访问权限。Inheritance继承:说到继承大家应该不会太陌生,继承可以让子类拥有父类的各种公共属性和公共方法。无需再次编写相同的代码。在让子类继承父类的同时,可以重新定义一些属性,重写一些方法,即覆盖父类原有的属性和方法,使其获得与父类不同的功能。(摘自百度百科)子类继承父类后,子类既有父类的属性和方法,又有自己特有的属性和方法,也就是说,子类的功能更多或更多和父类一样,不亚于父类。classEmployees{constructor(name){this.name=name;}getName(){console.log(this.name)}staticseyHi(){console.log("Hi");}}classJavaextendsEmployees{constructor(name){super(name);}work(){console.log("做后台工作");}}letjava=newJava("Aaron");java.getName();java.work();//java.seyHi();//java.seyHisnotafunction从上面的例子可以看出,继承不继承父类的静态方法,而只继承父类的公共属性和方法。这是需要注意的事情。子类继承后,不仅有getName方法,还有自己的worker方法。Polymorphism多态:字面意思是“多种状态”,允许子类类型的指针赋值给父类类型的指针。(摘自百度百科)说白了,多态就是同一个东西,调用同一个方法,同一个参数,只是行为不同而已。多态分为两种,一种是行为多态和对象多态。多态表示重写和重载。什么是重写重写:子类可以继承父类中的方法而无需重写相同的方法。但是有时候子类并不想原封不动地继承父类的方法,而是想做一定的修改,这就需要方法重写。方法覆盖也称为方法覆盖。(摘自百度百科)classEmployees{constructor(name){this.name=name;}seyHello(){console.log("Hello")}getName(){console.log(this.name);}}classJavaextendsEmployees{constructor(name){super(name);}seyHello(){console.log(`你好,我叫${this.name},我在Java工作。`)}}constemployees=newEmployees("Aaron");constjava=newJava("Leo");employees.seyHello();//Hellojava.seyHello();//大家好,我叫Leo,从事Java工作。employees.getName();//Aaronjava.getName();//Leo从上面的代码可以看出,Java继承了Employees,但是子类和父类中都有一个seyHello方法。为了满足不同的需求,子类继承父类,然后重写seyHello方法。所以你调用的时候会得到不同的结果。由于子类继承父类,子类也有父类的getName方法。什么是超载?重载是函数或方法具有相同名称但参数列表不同的情况。这种具有相同名称和不同参数的函数或方法称为重载函数或方法。(摘自百度百科)classEmployees{constructor(arg){letobj=null;switch(typeofarg){case"string":obj=newStringEmployees(arg);break;case"object":obj=newObjEmployees(ObjEmployees);break;case"number":obj=newNumberEmployees(ObjEmployees);break;}returnobj;}}classObjEmployees{构造函数(arg){console.log("ObjEmployees")}}classStringEmployees{构造函数(arg){console.log("StringEmployees")}}classNumberEmployees{constructor(arg){console.log("NumberEmployees")}}newEmployees({})//ObjEmployeesnewEmployees("123456")//StringEmployeesnewEmployees(987654)//NumberEmployees因为JavaScript没有重载的概念所以您必须编写自己的逻辑来完成重载。上面代码中,定义了Employees、ObjEmployees、StringEmployees、NumberEmployees类,在实例化Employees时在构造函数中进行判断,根据参数返回不同的对应类。这样就完成了一个简单的类重载。总结封装可以隐藏实现细节,使代码模块化;继承可以扩展现有的代码模块(类),它们的目的是为了代码重用。多态是同一件事,用相同的参数调用相同的方法,但表现出不同的行为。多态分为两种,一种是行为多态和对象多态。在编程中,使用这种编写思路来编程是非常有用的,它可以让你的代码具有很高的可重用性和可维护性。