<神奇的多態性>JavaScript作為一門動態語言,其神奇之處之一就是其多態性。多態是指一個對象在不同情況下有不同的表現形式和行為。在JavaScript中,多態性能夠使代碼更加靈活,適應性更強。接下來,我們將通過不同的例子來探討JavaScript中的多態性。<圓與正方形>假設我們有一個名為 Shape 的類,它有一個方法叫做 getArea() 。現在我們需要創建圓和正方形的對象,這些對象在計算它們的面積時,需要調用 Shape 的 getArea() 方法。為了實現這個目的,我們需要用到多態性。
這是 Shape 類的代碼:
class Shape {
getArea() {
console.log("Shape - getArea()");
return 0;
}
}
這里是 Circle 和 Square 類的代碼:class Circle extends Shape {
constructor(radius) {
super();
this.radius = radius;
}
getArea() {
console.log("Circle - getArea()");
return Math.PI * this.radius * this.radius;
}
}
class Square extends Shape {
constructor(length) {
super();
this.length = length;
}
getArea() {
console.log("Square - getArea()");
return this.length * this.length;
}
}
現在,我們可以創建 Circle 和 Square 的實例,并調用它們的 getArea() 方法,結果卻不一樣:let circle = new Circle(5);
let square = new Square(5);
console.log(circle.getArea()); // 輸出 78.53981633974483
console.log(square.getArea()); // 輸出 25
由于 Circle 和 Square 分別繼承了 Shape,它們在調用 getArea() 方法時,表現出了不同的行為,這就是 JavaScript 中的多態性。<方法重載與原型鏈>在面向對象編程中,方法重載是指讓方法在不同參數類型下表現不同的能力。而在JavaScript中,我們通常不會像Java或C++那樣進行方法重載,而是通過原型鏈的方式實現多態性。比如:class Person {
constructor(name) {
this.name = name;
}
speak() {
console.log(`${this.name} is speaking.`);
}
}
class Student extends Person {
constructor(name, grade) {
super(name);
this.grade = grade;
}
speak() {
console.log(`${this.name} is speaking, and I'm in grade ${this.grade}.`);
}
}
let p1 = new Person("John");
let s1 = new Student("Tom", 2);
p1.speak(); // 輸出 'John is speaking.'
s1.speak(); // 輸出 'Tom is speaking, and I'm in grade 2.'
在這個例子中,我們定義了一個 Person 類和一個 Student 類。兩個類之間存在繼承關系,Student 類重寫了父類的 speak() 方法,當調用 speak() 方法時,Student 類輸出的內容不同于父類。
通過方法重寫和原型鏈,JavaScript 能夠實現多態性。不同的對象能夠以不同的方式響應同一個方法調用,從而實現更靈活的編程。<總結>JavaScript 中的多態能夠增加代碼的靈活性和適應性。根據不同的情況,在不同的對象上調用相同的方法,可以實現不同的行為。在上述例子中,我們可以看到在不同的對象上調用相同的方法時,它們會表現出不同的行為。這就是 JavaScript 中多態的奇妙之處,也是面向對象編程中重要的概念之一。