在面向对象的编程过程中通常为了提供代码的效率,我们通常会用到用到重载和重写这两种方法来提高代码的效率
重载
方法名称相同,参数的类型或者个数不同;
重载是面向面向对象编程的一种特有的写法,它可以允许一个函数在实现的过程中有多个入口,而且只用实现一次
function overload(x:string,y:string):void;
function overload(x:number,y:number):number;
function overload(x: number, y: number, z: number):number;
function overload(x,y:(number|string),z?:number): any{
// 因为参数可变所以 要使用 ?: 来表示可选参数
if (typeof y === "number" && !z) {
return x+y
}
if (z) {
return x+y+z
}
console.log("void"+x+y)
}
console.log(overload(1, 4));
console.log(overload(1, 4, 6))
overload("a","a")
上述就是普通的方法重载
下面是重载在类中应用
class Overload{
overload(x: string, y: string): void;
overload(x: number, y: number): number;
overload(x: number, y: number, z: number): number;
overload(x,y:(number|string),z?:number): any{
if (typeof y === "number" && !z) {
return x+y
}
if (z) {
return x+y+z
}
console.log("void"+x+y)
}
}
var ol = new Overload();
console.log(ol.overload(1, 4));
console.log(ol.overload(1, 4, 6))
ol.overload("a", "a")
可以看出重载会根据参数来决定要从内个入口进入,然后执行相应的代码块
重写
方法名称,参数类型,返回值类型全部相同
当父类和其派生类拥有同一个方法时,出现这种情况,就是方法的重写
主要的作用:在保有父类的方法特征的同时,自身也拥有一些独特的特征
class Person {
eat(){
console.log("吃")
}
}
class Student extends Person {
constructor() {
super()
}
eat() {
console.log("花里胡哨的")
super.eat()
}
}
var student = new Student()
student.eat() ;
// 花里胡哨的
// 吃
从原生js原型链的角度上来看待这个方法的重写
当一个对象要执行一个方法的时候,会从原型链上从上往下找下去,当发现首次发现这个方法的时候,就会去执行,student这对象的原型时Student类其次是Person类,所以会首先执行Student类中的方法,然后Student类eat方法中有super.eat()
意思是同时也引用了父类的eat方法,然后就实现了方法的重载,也可以试着删除super.eat()
试试