Javascript中的繼承關系是編程中一項基本而重要的概念。它允許我們創建一個對象,它可以利用另一個已存在的對象作為其基礎模板。這個新對象就會繼承其基礎對象的屬性和方法,并且可以擴展或修改這些屬性和方法,使其具有更多的功能性。
在Javascript中,繼承主要有兩種形式:原型繼承和構造函數繼承。
原型繼承
//定義基礎對象 var animal = { legs: 4, eat: function () { console.log("I am eating."); } }; //定義新對象并繼承基礎對象 var dog = Object.create(animal); dog.breed = "Golden Retriever"; dog.run = function () { console.log("I am running."); };
在原型繼承中,我們使用Object.create()方法來將一個已存在的對象作為新對象的原型,從而實現繼承。在上述例子中,我們定義了一個基礎對象“animal”,然后用“dog”繼承了它。這樣,“dog”就能夠共享“animal”的屬性和方法。
我們還可以修改和添加新的屬性和方法。如上所示,我們添加了一個“breed”屬性和一個“run”方法到“dog”中。
構造函數繼承
// 定義基礎構造函數 function Animal() { this.legs = 4; this.eat = function () { console.log("I am eating."); } } //定義新構造函數并繼承基礎構造函數 function Dog() { Animal.call(this); this.breed = "Golden Retriever"; this.run = function () { console.log("I am running."); } }
構造函數繼承與原型繼承不同,我們是通過調用一個構造函數來實現繼承的。在上述例子中,我們定義了一個基礎構造函數“Animal”,然后又用“Dog”構造函數繼承它。這樣,“Dog”就能夠使用“Animal”的屬性和方法,同時又能夠添加自己的屬性和方法。
在繼承時,我們使用Animal.call(this)方法將Animal的屬性和方法引入到Dog的實例中。這就意味著,每當我們創建一個Dog的實例時,都會調用Animal構造函數。
多層繼承
//定義基礎構造函數 function Animal() { this.legs = 4; this.eat = function () { console.log("I am eating."); } } //定義中間構造函數 function Mammal() { Animal.call(this); this.skin = "Hair"; } //定義最終的繼承構造函數 function Dog() { Mammal.call(this); this.breed = "Golden Retriever"; this.run = function () { console.log("I am running."); } }
多層繼承就是在一個對象的基礎上,再創建另一個對象,并且新建的對象又可作為其他對象的基礎。在上述例子中,“Dog”繼承自“Mammal”,“Mammal”又繼承自“Animal”。
在調用Mammal的時候,我們使用Mammal.call(this)方法來繼承Animal的屬性和方法。同理,在調用Dog的時候,我們使用Dog.call(this)方法來繼承Mammal的屬性和方法。
總結
繼承是Javascript中非常重要的一個概念。它允許我們創建新對象并在不重復編寫代碼的情況下,利用已存在的對象作為基礎模板,實現代碼的重用。在Javascript中,主要有原型繼承和構造函數繼承兩種形式,并且可以將它們結合使用來實現多層繼承。