多态性是面向对象编程中的核心概念之一,它允许不同类型对象对同一方法、字段或属性的调用做出响应,每个响应都根据适当的类型特定行为进行。在JavaScript中,尽管没有像其他编程语言那样的接口,但有超类和子类。本文将通过一个简单的例子来演示如何在JavaScript中实现多态性。
多态性的主要使用场景是,对象能够响应相同名称的方法、字段或属性调用,但每种类型都有其特定的行为。程序员不需要事先知道对象的确切类型,因此确切的行为是在运行时确定的。这就是所谓的后期绑定或动态绑定,这也是多态性非常酷的一个特性。要求是,所有超类、子类和接口中必须有相同名称的属性和相同参数集。
在JavaScript中,没有像其他编程语言那样的接口,但有超类和子类。可以通过创建一个继承自另一个类的类来实现多态性。下面是一个简单的例子,将创建一个名为Person的类,然后创建一个名为Manager的类,它继承自Person。这两个类都将包含一个名为wake_up()的方法。然后将创建这两种类型的对象,并将它们放入一个数组中。当遍历这个数组时,系统将调用每个对象的wake_up()函数,实现将动态确定。
首先,定义一个Person类,它包含id、name和age属性,以及wake_up()和get_age()方法。
Person = function (id, name, age) {
this.id = id;
this.name = name;
this.age = age;
}
Person.prototype = {
wake_up: function () {
alert('A person is awake');
},
get_age: function () {
return this.age;
}
}
接下来,创建一个继承类,以便其他类可以从Person类继承。
Inheritance_Manager = {};
Inheritance_Manager.extend = function (subClass, baseClass) {
function inheritance() {}
inheritance.prototype = baseClass.prototype;
subClass.prototype = new inheritance();
subClass.prototype.constructor = subClass;
subClass.baseConstructor = baseClass;
subClass.superClass = baseClass.prototype;
}
然后,定义Manager类,它继承自Person类,并添加了salary属性。
Manager = function (id, name, age, salary) {
Manager.baseConstructor.call(this, id, name, age);
this.salary = salary;
}
Inheritance_Manager.extend(Manager, Person);
为了展示多态性,重写Manager类的wake_up()方法。
Manager.prototype = {
wake_up: function () {
alert('I am in control with Polymorphism');
}
}
var arrPeople = new Array();
arrPeople[0] = new Person(1, 'Joe Tester', 26);
arrPeople[1] = new Manager(1, 'Joe Tester', 26, '20.000');
for (var i in arrPeople) {
arrPeople[i].wake_up();
alert(arrPeople[i].get_age());
}