多态的定义
维基百科对多态的定义:多态(英语:polymorphism)指为不同数据类型的实体提供统一的接口,或使用一 个单一的符号来表示多个不同的类型。这看起来还是非常抽象的!
简单点的理解
不同的数据类型进行同一个操作,表现出不同的行为,就是多态的体现。从这个定义来看JS是一定存在多态的。
TS的多态(传统面向对象的多态)
传统面向对象的多态是由三个前提组成的。
- 必须有继承(继承是多态的前提)
- 必须有重写(只有子类重写了父类的方法,调这个方法表现出来的形态才是不一样的)
- 必须有父类引用指向子类对象
下面我们来看一个案例
class Shape{
getArea(){
}
}
class Rectangle extends Shape{
getArea(){
return 100
}
}
class Circle extends Shape{
getArea() {
return 200
}
}
var r = new Rectangle()
var c = new Circle()
//多态:当我们对不同的数据类型,执行同一个操作时,如果表现出来的行为(形态)不一样,那就是多态的体现。
function calcArea(shape:Shape){
console.log(shape.getArea()); //父类的引用指向子类的对象var shape:Shape = new Rectangle()
}
calcArea(r)
calcArea(c)
export{}
JS的多态
JS的多态相对传统面向对象的原因如JAVA而言,没有那么复杂。JS中当对不同的数据类型执行同一个操作时,如果表现出来的行为不一样,那么就是多态的体现 。
这其实就是一种多态的表现,看上去非常弱智。
function sum(m,n){
return m + n
}
sum(20,30)
sum("abc","cba") //党对不同的数据类型执行同一个操作时,表现出来的行为不一样
再来个稍微复杂点的,这个也是多态的表现。
function calcArea(foo){
console.log(foo.getArea);
}
let obj1 = {
name:'why',
getArea(){
return 1000
}
}
class Person{
getArea(){
return 100
}
}
var p = new Person()
calcArea(obj1)
calcArea(p)