在JavaScript中,原型鏈?zhǔn)且环N繼承機(jī)制,允許對象共享另一個對象的屬性和方法。要擴(kuò)展一個原型,你可以通過以下幾種方法:
Object.create()
方法:Object.create()
方法創(chuàng)建一個新對象,并將其原型設(shè)置為指定的對象。這樣,新對象將繼承原始對象的屬性和方法。例如,假設(shè)我們有一個名為Person
的原型對象,我們想要擴(kuò)展它以包含Student
對象的功能:
function Person() {
this.name = 'John';
}
Person.prototype.sayHello = function() {
console.log('Hello, my name is ' + this.name);
};
function Student() {
Person.call(this); // 調(diào)用Person構(gòu)造函數(shù)
this.school = 'ABC University';
}
// 設(shè)置Student的原型為Person的實(shí)例,實(shí)現(xiàn)繼承
Student.prototype = Object.create(Person.prototype);
// 修復(fù)Student的構(gòu)造函數(shù)指向
Student.prototype.constructor = Student;
Student.prototype.saySchool = function() {
console.log('I am a student at ' + this.school);
};
var student = new Student();
student.sayHello(); // 輸出: Hello, my name is John
student.saySchool(); // 輸出: I am a student at ABC University
Object.assign()
方法:Object.assign()
方法允許你將一個或多個源對象的所有可枚舉屬性復(fù)制到目標(biāo)對象。這樣,你可以將Person
原型的方法復(fù)制到Student
原型上,實(shí)現(xiàn)繼承。
function Person() {
this.name = 'John';
}
Person.prototype.sayHello = function() {
console.log('Hello, my name is ' + this.name);
};
function Student() {
Person.call(this); // 調(diào)用Person構(gòu)造函數(shù)
this.school = 'ABC University';
}
// 將Person原型的方法復(fù)制到Student原型上
Object.assign(Student.prototype, Person.prototype);
Student.prototype.saySchool = function() {
console.log('I am a student at ' + this.school);
};
var student = new Student();
student.sayHello(); // 輸出: Hello, my name is John
student.saySchool(); // 輸出: I am a student at ABC University
這兩種方法都可以實(shí)現(xiàn)原型鏈的擴(kuò)展,但它們之間有一些差異。Object.create()
方法創(chuàng)建一個新對象,其原型指向指定的對象,而Object.assign()
方法將源對象的屬性復(fù)制到目標(biāo)對象。在實(shí)際項(xiàng)目中,你可以根據(jù)需要選擇合適的方法。