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/ 宣告:歡迎任何形式的轉載,但請務必注明出處!!!
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/541879.html
標籤:JavaScript
下一篇:day08-Axios
