爲何都說js 裏面任何對象最終都繼承了Object對象

今天閒來無事,看見幾行小字。
又說全部對象,繼承終是Obj。
—— 強行押韻一波

這首詩的意思就是說的我今天沒有什麼事情,而後無心中又在網上看到了「任何對象都是從Object對象繼承而來的」這句話。一時興起,便去驗證這句話。ps. 我好像歷來在原型鏈上面都沒有走到過Object對象,我今天必定要把它點出來!
圖片描述javascript

首先咱們探究ES五、ES6裏面的__proto__、prototype

首先咱們從《JavaScript高級程序(第三版)》裏面找到這張圖
圖片描述java

此圖片告訴了咱們2個道理:es6

一、一個實例的 [[Prototype]] (__proto__屬性),指向它構造函數的原型對象
這句話聽起來有點兒複雜,把它簡化一下
一個實例的__proto__屬性,指向它的原型對象
二、一個原型對象的constructor屬性又指回了這個對象

下面咱們來console一下ES5構造函數和ES6類的__proto__、prototype
一、es5 和 es6 這兩個實例的__proto__ 指向了它們構造函數的原型對象(簡稱指向了它們的原型對象)chrome

function ES5Fun(language){
  this.name = "ES6Class類";
  this.language = language;
}
ES5Fun.prototype.favorit = "足球";
let es5 = new ES5Fun("中文");


class ES6Class {
  constructor(props){
    this.className = "ES6Class類"
  }
  printfName(){
    console.log("如今printName準備開始打印")
    this.getName();
  }
  getName(){
    console.log("此類的類名是:" +this.className)
  }
}
let es6 = new ES6Class();


console.log(ES5Fun.prototype)
console.log(ES6Class.prototype)

在chrome中的運行結果爲:函數

clipboard.png

console.log(es5.__proto__ === ES5Fun.prototype)            //true
console.log(es6.__proto__ === ES6Class.prototype)          //true

二、es5 和 es6 這兩個實例的constructor 指向了它們的構造函數this

//這是Node 裏面運行的結果
console.log(es5.constructor)        //[Function: ES5Fun]
console.log(es6.constructor)        //[Function: ES6Class]
console.log(es5.constructor === ES5Fun)            //true
console.log(es6.constructor === ES6Class)          //true

三、構造函數ES5Fun 和 ES6Class 的原型對象的 constructor 又指回了它們自己es5

//這是Node 裏面的運行結果
console.log(ES5Fun.prototype.constructor)                //[Function: ES5Fun]        
console.log(ES6Class.prototype.constructor)              //[Function: ES6Class]  
console.log(ES5Fun === ES5Fun.prototype.constructor)                //true
console.log(ES6Class === ES6Class.prototype.constructor)            //true

因此推導出spa

console.log(es5.constructor === ES5Fun.prototype.constructor)                //true
console.log(es6.constructor === ES6Class.prototype.constructor)              //true
console.log(es5.constructor === es5.__proto__.constructor)                   //true 
console.log(es6.constructor === es6.__proto__.constructor)                   //true

下面我要開始開車了
圖片描述準備好了嗎?嘟嘟,嘟嘟。嘟嘟,嘟嘟。prototype

ES5Fun 和 ES6Class 繼續再往它們的構造函數和原型對象上面延伸看能獲得什麼

首先打印出Function對象自己,看看是什麼便於後面參考code

//Node 下面的執行結果
console.log(Function)        //[Function: Function]

ES6Class的構造函數是 Function對象

//Node 下面的執行結果
console.log(ES6Class.constructor)          //[Function: Function]
console.log(ES6Class.constructor === Function)           //true

ES6Class的__proto__ 固然也就指向它構造函數的原型對象

console.log(ES6Class.__proto__)        //[Function]
console.log(ES6Class.__proto__ === Function.prototype)        //true

那麼Function的construct屬性呢? 神奇的事情出現了,Function的construct屬性居然就等於 ES6Class的constructor屬性

console.log(Function.constructor);
console.log(Function.constructor === ES6Class.constructor)

緣由是Function的constructor 沒有指向它的構造函數而是指向了它自己(或者說Function的構造函數就是它自己)

console.log(Function.constructor === Function)        //true
console.log(Function.constructor.constructor.constructor.constructor.constructor.constructor.constructor.constructor)        //[Function: Function]
console.log(Function.constructor === Function.constructor.constructor.constructor.constructor.constructor.constructor)       //true

Function的原型對象等於 ES6Class.__proto__

console.log(Function.__proto__)                //[Function]
console.log(Function.__proto__ === ES6Class.__proto__)        //true
// 再次證實 Function.constructor 指向它本身
console.log(Function.constructor.__proto__)    //[Function]
console.log(Function.constructor.constructor.constructor.constructor.__proto__)        //[Function]

一個對象的原型對象的constructor 指向這個對象本身,這一點兒Function也不例外

console.log(Function.__proto__.constructor);                //[Function: Function]
console.log(Function.__proto__.constructor === Function);            //true

最後咱們終於找到了原型鏈的盡頭 Function原型對象的原型對象是一個{ }

console.log(Function.__proto__.__proto__)        //{}
//它再往上的原型對象是一個null
console.log(Function.__proto__.__proto__.__proto__)        //null
//這個原型對象的constructor指向了Object
console.log(Function.__proto__.__proto__.constructor)      //[Function: Object]
console.log(Function.__proto__.__proto__.constructor === Object)        //true

總結

一、Function.constructor 指向它自己,不指向它的構造函數(或者說Function的構造函數就是它自己)這個我也不太清楚
二、Function.__proto__.__proto__.constructor === Object

console了這麼多東西,我先去廁所吐了,兄弟們點個贊再走
聽說是一條小團團真人,鬼曉得

相關文章
相關標籤/搜索