原型和繼承 constructor、prototype、__proto__
之前大神說,學習 JS 遇到原型和繼承果斷的跳過吧,沒有它們,你也可以把 JS 玩的很 6
突然入了坑,簡單的記錄一下
構造函數
實例對象
用來初始化新創建的對象的函數是構造函數。
在 C++ 語言中,類 有一個構造函數, 它與類同名且沒有返回值的(可以不寫,也可重載多個);
在 JS 中, 沒有 類 的概念,原型對象 姑且等同於 類 ,原型對象有 constructor 屬性,該屬性指向原型對象的構造函數。 JS 中默認存在的一些原型對象,也存在它們的構造函數,比如 Object() Array() Function() String() Number() Boolean() 等。
通過構造函數可以實例化多個對象,它們稱為實例對象,且他們擁有相同的原型對象。 可以通過原型對象來實現 繼承。
prototype
構造函數有 prototype 屬性, 指向實例對象的原型對象。 同一構造函數實例化的不同實例對象指向相同的原型對象。 在 prototype 下定義的方法 有點像 C++ 裏的在 類
constructor
原型對象有 constructor 屬性,指向該原型對象的構造函數。
由於實例繼承自原型對象,所以也擁有 constructor 屬性, 指向原型對象的構造函數。
一句話,他們的指向完全相同
__proto__
實例對象有 __protp__ 屬性,指向該實例對象對應的原型對象。 也可以理解為 父級對象 吧
構造函數也有 __proto__ 屬性。constructor 下的 __proto__ 是指向 Function() 的,說到底構造函數也是一個稍特殊的函數(比普通函數多一個 prototype)
舉個栗子:
constructor、prototype、__ptoto__
(3)[1,2,3] 是一個長度為 3 的數組,也是一個實例對象
1 這個實例對象對應的原型對象(__protp__)是 Array(0)
2 這個原型對象有 constructor 屬性,指向該原型對象的構造函數 f Array() 1、f 代表是個函數 ;2、Array() 構造函數。 實例對象因為繼承也擁有 constructor 屬性。
3 這個構造函數有 prototype 屬性,指向實例對象對應的原型對象,也就是 Array(0)
4 綜合 1 3 可得:實例對象對應的原型對象 === 實例對象對應的原型對象的構造函數的原型對象,hiahiahia..... 這麽一來,在原型對象的 constructor 屬性下的 prototype 屬性下會看到無限的自我循環。 prototype 屬性 指向的原型對象有 constructor 屬性, constructor 屬性指向的構造函數 有 prototype 屬性, prototype 屬性指向的原型對象有 constructor 屬性......
var arr = new Array(); console.log(Array.prototype.constructor === Array); // true 原型對象的 constructor 屬性指向 console.log(arr.constructor === Array); // true 實例對象的 constructor 屬性指向
這麽說吧:
constructor 指向的是構造函數
prototype 和 __protp__ 指向的都是原型對象。前者指向自己,後者指向父級。
繞口令一般的..........
希望不是誤導..........
原型和繼承 constructor、prototype、__proto__