克服JS奇怪的部分_物件導向與原型繼承

Huang Pei
4 min readNov 8, 2019

--

繼承(Inheritance)/ 原型/ 所有的東西都是物件

本筆記出自:JavaScript 全攻略:克服 JS 的奇怪部分

繼承 (Inheritance)

One object gets access to the properties and methods of another object.

繼承表示一個物件取用另一個物件的屬性或方法。

瞭解原型

JavaScript中的所有物件,包含函數所有物件都有原型屬性,這個屬性會參考到另一個物件,我們稱為原型 proto(被參考的物件)。

以obj.prop2為例,obj 是個單獨的物件,我們可以參考它的屬性物件proto,取用其屬性和方法prop2,點運算子會尋找prop2,在obj找不到就往obj的原型proto找,然後回傳,pro3同理,以此類推。

若有另個物件obj2,它可以指向同個原型,並進行分享,所以若呼叫 obj2.prop2,它會回傳一樣的屬性,和 obj.prop2 的記憶體位置一樣。

覺得不錯的文章

//作為原型的person
var
person = {
firstName: "Default",
lastName: "Default",
getFullName() {
var fullName = this.firstName + " " + this.lastName;
return fullName;}
}
var john = {
firstName: "John",
lastName: "Doe"}
var jane = {
firstName: "Jane"
}
示範用!不建議這麼寫!!//讓john繼承person,在john中找不到getFullName,就往proto找,在person中找到
john.__proto__ = person
console.log(john.getFullName()) = "John Doe"
//在john中已經有firstName屬性,所以不會再往原型鍊上找
console
.log(john.firstName) = "John"
//讓jane繼承person,Jane中找不到getFullName和lastName,往上使用person的
jane.__proto__ = person;
console.log(jane.getEullName()) = "Jane Default"

*當函數被呼叫,執行環境被創造,this變數會知道我們要用的物件是哪個(就是我們呼叫的物件),所以this不會參考到person,而是會參考到j找到呼叫它的物件john/ jane。

所有東西都是物件(或純值)

JavaScript 的所有東西都是 物件 或是 純值。

函數、陣列、一般物件,所有東西到最後會到基本物件( base object, Object{} ),這個物件沒有原型(往上找是null),也就是在原型鏈最下面的東西。

The Object.prototype is a property of the Object constructor. And it is also the end of a prototype chain.

設定 a, b, c,並使用.__proto__一路往上找,到底都會抵達基本物件 Object{},
再往上找就是null,也就是沒有了、結束了。
a = {};
b = function(){};
c = [];

--

--

Huang Pei
Huang Pei

Written by Huang Pei

記錄用倉庫,歡迎指正。菜鳥前端,最菜的那種(超能力少女です)。

No responses yet