今天閒來無事,看見幾行小字。
又說全部對象,繼承終是Obj。
—— 強行押韻一波
這首詩的意思就是說的我今天沒有什麼事情,而後無心中又在網上看到了「任何對象都是從Object對象繼承而來的」這句話。一時興起,便去驗證這句話。ps. 我好像歷來在原型鏈上面都沒有走到過Object對象,我今天必定要把它點出來!javascript
首先咱們從《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中的運行結果爲:函數
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
首先打印出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了這麼多東西,我先去廁所吐了,兄弟們點個贊再走