更新時(shí)間:2023年12月20日10時(shí)45分 來(lái)源:傳智教育 瀏覽次數(shù):
在原生JavaScript中實(shí)現(xiàn)繼承關(guān)系可以使用原型鏈或者ES6中的類(lèi)來(lái)實(shí)現(xiàn)。下面筆者將分別展示這兩種方式。
原型鏈繼承通過(guò)將一個(gè)對(duì)象的原型設(shè)置為另一個(gè)對(duì)象,從而實(shí)現(xiàn)繼承。這種方法簡(jiǎn)單,但也存在一些潛在問(wèn)題。
// 父類(lèi)構(gòu)造函數(shù) function Animal(name) { this.name = name; } // 在父類(lèi)原型上添加方法 Animal.prototype.makeSound = function() { console.log('Some generic sound'); }; // 子類(lèi)構(gòu)造函數(shù) function Dog(name, breed) { Animal.call(this, name); this.breed = breed; } // 將子類(lèi)的原型設(shè)置為父類(lèi)的一個(gè)實(shí)例 Dog.prototype = Object.create(Animal.prototype); // 修正子類(lèi)的構(gòu)造函數(shù)指向 Dog.prototype.constructor = Dog; // 在子類(lèi)原型上添加方法 Dog.prototype.bark = function() { console.log('Woof! Woof!'); }; // 實(shí)例化子類(lèi) const myDog = new Dog('Buddy', 'Golden Retriever'); // 測(cè)試?yán)^承方法和屬性 myDog.makeSound(); // 輸出: Some generic sound myDog.bark(); // 輸出: Woof! Woof! console.log(myDog.name); // 輸出: Buddy console.log(myDog instanceof Dog); // 輸出: true console.log(myDog instanceof Animal); // 輸出: true
ES6引入了class關(guān)鍵字,使得面向?qū)ο缶幊谈忧逦鸵子诶斫狻?/p>
// 父類(lèi) class Animal { constructor(name) { this.name = name; } makeSound() { console.log('Some generic sound'); } } // 子類(lèi)繼承父類(lèi) class Dog extends Animal { constructor(name, breed) { super(name); this.breed = breed; } bark() { console.log('Woof! Woof!'); } } // 實(shí)例化子類(lèi) const myDog = new Dog('Buddy', 'Golden Retriever'); // 測(cè)試?yán)^承方法和屬性 myDog.makeSound(); // 輸出: Some generic sound myDog.bark(); // 輸出: Woof! Woof! console.log(myDog.name); // 輸出: Buddy console.log(myDog instanceof Dog); // 輸出: true console.log(myDog instanceof Animal); // 輸出: true
這兩種方式都可以實(shí)現(xiàn)繼承關(guān)系,ES6的類(lèi)語(yǔ)法更加清晰易懂,并且避免了原型鏈繼承的一些問(wèn)題。
北京校區(qū)