在面向对象编程(OOP)中,多态(Polymorphism)是指同一操作或方法在不同对象上有不同表现形式的能力。简而言之,多态允许不同类的对象在调用相同的方法时表现出不同的行为。在JavaScript中,对象的多态性是与生俱来的。基于原型机制产生的属性遮蔽行为,可以很自然地覆盖原型上的方法。根据接收参数的不同,同样的方法调用可以轻易地表现出不同的行为。
常见的两种实现方式
- 覆盖。子类重新定义父类方法,不同的子类可以自定义实现父类的方法。
- 重载。多个同名但参数不同的方法。ECMAScript中没有重载的概念,但是JavaScript函数可以对同名函数中不同类型的传参做出不同行为的响应。算是某种意义上的重载。
在子对象上覆盖父对象的方法
class Person {
constructor(name, age) {
this.name = name;
}
introduce() {
return 'My name is ' + this.name;
}
}
class Engineer extends Person {
constructor(name, age, job) {
super(name, age);
this.job = job;
}
introduce() {
return 'My job is ' + this.job;
}
}
const person = new Person('Guang', 32, 'Software Engineer');
const engineer = new Engineer('Guang', 32, 'Software Engineer');
console.log(person.introduce()); // 输出:"My name is Guang"
console.log(engineer.introduce()); // 输出:"My job is Software Engineer"
在这个示例中,Person
类和Engineer
类都实现了introduce
方法,但Engineer
重写了该方法来提供不同的行为。根据person
和engineer
的不同类型,调用了不同的 introduce 方法。
重载
function add(a, b) {
return a + b;
}
console.log(add(1, 2)); // 输出 3
console.log(add('1', '2')); // 输出 "12"
根据输入参数的类型,add()
函数相应了不同的行为,对两个数字,进行了数字加操作,对两个字符串,进行了字符串拼接操作。这是一个简单的重载示例。