1. 媒介
相识过面向对象的同砚应当都晓得,面向对象三个基本特征是:封装、继续、多态,然则关于这三个词详细可以不太相识。
2. 封装
在说封装之先相识一下封装究竟是什么?
什么是封装
封装:将对象运转所需的资本封装在顺序对象中——基本上,是要领和数据。对象是“宣布其接口”。其他附加到这些接口上的对象不须要体贴对象完成的要领即可应用这个对象。这个观点就是“不要告诉我你是怎样做的,只要做就可以了。”对象可以看做是一个自我包含的原子。对象接口包含了大众的要领和初始化数据。(节选自百度百科)
我关于封装的明白,可以另有一个步骤就是抽离
,起首你要清晰在一个对代码中你应当抽离那些属性要领,有了这些为基本才更好的做好封装。
封装不过就是其属性和要领封装。
- 类:封装对象的属性和行动
- 要领:封装详细逻辑功用
- 接见封装:接见润饰封装不过就是对其接见权限举行封装
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
,但是getInfo
与seyHi
所差别的是seyHi
应用了static
润饰符,转变其为静态要领,seyHi
只属于Employees
这个类。但是getInfo
要领则是属于实例的。
这里应用了static
对seyHi
要领对其举行了接见权限的封装。
再举一个例子。
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
对其要领的接见权限举行了封装。
3. 继续
继续:说到继续并不太生疏,继续可以使得子类具有父类的种种的公有属性
和公有要领
。而不须要再次编写雷同的代码。在令子种别继续父种别的同时,可以从新定义某些属性,并重写某些要领,即掩盖父种别的原有属性和要领,使其获得与父种别差别的功用。(节选自百度百科)
子类继续父类后,子类具有父类属性和要领,但是也一样具有本身所独占的属性和要领,也就是说,子类的功用要比父类多或雷同,不会比父类少。
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
要领。
4. 多态
多态:按字面的意义就是“多种状况”,许可将子类范例的指针赋值给父类范例的指针。(节选自百度百科)
说白了多态就是雷同的事物,挪用其雷同的要领,参数也雷同时,但表现的行动却差别。多态分为两种,一种是行动多态与对象的多态。
多态的表现形式重写与重载。
什么是重写
重写:子类可继续父类中的要领,而不须要从新编写雷同的要领。但偶然子类并不想一成不变地继续父类的要领,而是想作肯定的修正,这就须要采纳要领的重写。要领重写又称要领掩盖。(节选自百度百科)
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
内里举行了推断,依据参数的差别返回差别的对应的类。
如许完成了一个简朴的类重载。
5. 总结
- 封装可以隐蔽完成细节,使得代码模块化;
- 继续可以扩大已存在的代码模块(类),它们的目标都是为了——代码重用。
- 多态就是雷同的事物,挪用其雷同的要领,参数也雷同时,但表现的行动却差别。多态分为两种,一种是行动多态与对象的多态。
在编程的是多多应用这个写头脑对其编程时很有效的,可以使你的代码到达高复用以及可保护。