1. 程式人生 > >原型和繼承 constructor、prototype、__proto__

原型和繼承 constructor、prototype、__proto__

font 原型 c++ class 也有 post obj 分享 方法

之前大神說,學習 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__