JavaScript 是一種基於原型繼承的語言。在 JavaScript 中,對象是通過原型鏈來繼承屬性和方法的。 一、原型 每一個對象都有一個 proto 屬性,該屬性指向該對象的原型。原型本質上也是一個對象,所有的對象都擁有一個原型,除了 Object.prototype。 JavaScript ...
JavaScript 是一種基於原型繼承的語言。在 JavaScript 中,對象是通過原型鏈來繼承屬性和方法的。
一、原型
每一個對象都有一個 proto 屬性,該屬性指向該對象的原型。原型本質上也是一個對象,所有的對象都擁有一個原型,除了 Object.prototype。
JavaScript 中有一個 Object.create() 方法可以用來創建一個新對象,並且可以指定該對象的原型。
例如:
let obj1 = {
name: "object1",
sayName: function() {
console.log(this.name);
}
};
let obj2 = Object.create(obj1);
console.log(obj2.name); // "object1"
obj2.sayName(); // "object1"
在上面代碼中,obj2 是通過 obj1 創建的,obj2 的原型是 obj1,所以 obj2 可以繼承 obj1 的屬性和方法。
二、原型鏈
原型鏈是一種鏈式結構,它描述了對象與其原型之間的關係。當對象訪問一個屬性或方法時,如果在自身中找不到,就會在其原型中尋找,如果在原型中還找不到,就會繼續在原型的原型中尋找,直到找到為止或者到達原型鏈的頂端(Object.prototype)。
在 JavaScript 中,原型鏈的頂端是 Object.prototype,它是所有對象的根原型。Object.prototype 上面沒有原型了。
同時原型鏈也可能會出現迴圈引用的情況,所以在使用原型鏈時需要註意避免這種情況。
JavaScript 中的原型和原型鏈是 JavaScript 中非常重要的一部分,它們是 JavaScript 繼承的基礎。在 JavaScript 中,所有的對象都是通過原型繼承來繼承屬性和方法的,這樣能夠節省記憶體空間和提高代碼復用性。
三、繼承
對於 JavaScript 的繼承來說,原型鏈是其中一種常用的方式,還有一種是 ES6 中新增的類和繼承的概念。
ES6 中的 class 和 extends 關鍵字可以用來定義類和繼承。這種方式和原型鏈繼承本質上是一樣的,只是語法上更加類似傳統面向對象語言。
例如:
class Parent {
constructor(name) {
this.name = name;
}
sayName() {
console.log(this.name);
}
}
class Child extends Parent {
constructor(name, age) {
super(name);
this.age = age;
}
sayAge() {
console.log(this.age);
}
}
let child = new Child("Bob", 10);
child.sayName(); // "Bob"
child.sayAge(); // 10
在上面的代碼中,使用 class 和 extends 關鍵字定義了一個父類 Parent 和一個子類 Child。Child 類繼承了 Parent 類,也就是說 Child 對象可以繼承 Parent 對象的屬性和方法。
constructor
是類的構造函數,在使用 new
創建類的實例時會調用該函數。在子類中,使用 super(name)
調用父類的構造函數,這樣可以繼承父類的屬性。
在子類中可以添加新的屬性和方法,例如 sayAge 方法,這樣就實現了對父類的繼承和擴展。
JavaScript 的原型鏈和 ES6 中的 class 和 extends 都是實現繼承的方式。其中原型鏈繼承更加靈活,對於繼承和擴展都比較方便,但是語法上比較麻煩。而 class 和 extends 的語法更加類似傳統面向對象語言,更加易於理解,但是在繼承和擴展上比較限制。
作者:yuzhihui出處:http://www.cnblogs.com/yuzhihui/ 聲明:歡迎任何形式的轉載,但請務必註明出處!!!