成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

為什么都說js 里面任何對象最終都繼承了Object對象

Gemini / 574人閱讀

摘要:今天閑來無事,看見幾行小字。又說所有對象,繼承終是。強行押韻一波這首詩的意思就是說的我今天沒有什么事情,然后無意中又在網(wǎng)上看到了任何對象都是從對象繼承而來的這句話。一時興起,便去驗證這句話。

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

這首詩的意思就是說的我今天沒有什么事情,然后無意中又在網(wǎng)上看到了“任何對象都是從Object對象繼承而來的”這句話。一時興起,便去驗證這句話。ps. 我好像從來在原型鏈上面都沒有走到過Object對象,我今天一定要把它點出來!

首先我們探究ES5、ES6里面的__proto__、prototype

首先我們從《JavaScript高級程序(第三版)》里面找到這張圖

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

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

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

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("現(xiàn)在printName準(zhǔn)備開始打印")
    this.getName();
  }
  getName(){
    console.log("此類的類名是:" +this.className)
  }
}
let es6 = new ES6Class();


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

在chrome中的運行結(jié)果為:

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

2、es5 和 es6 這兩個實例的constructor 指向了它們的構(gòu)造函數(shù)

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

3、構(gòu)造函數(shù)ES5Fun 和 ES6Class 的原型對象的 constructor 又指回了它們本身

//這是Node 里面的運行結(jié)果
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

所以推導(dǎo)出

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   

下面我要開始開車了
準(zhǔn)備好了嗎?嘟嘟,嘟嘟。嘟嘟,嘟嘟。

ES5Fun 和 ES6Class 繼續(xù)再往它們的構(gòu)造函數(shù)和原型對象上面延伸看能得到什么

首先打印出Function對象本身,看看是什么便于后面參考

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

ES6Class的構(gòu)造函數(shù)是 Function對象

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

ES6Class的__proto__ 當(dāng)然也就指向它構(gòu)造函數(shù)的原型對象

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

那么Function的construct屬性呢? 神奇的事情出現(xiàn)了,F(xiàn)unction的construct屬性竟然就等于 ES6Class的constructor屬性

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

原因是Function的constructor 沒有指向它的構(gòu)造函數(shù)而是指向了它本身(或者說Function的構(gòu)造函數(shù)就是它本身)

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
總結(jié)

1、Function.constructor 指向它本身,不指向它的構(gòu)造函數(shù)(或者說Function的構(gòu)造函數(shù)就是它本身)這個我也不太清楚
2、Function.__proto__.__proto__.constructor === Object

console了這么多東西,我先去廁所吐了,兄弟們點個贊再走

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/106249.html

相關(guān)文章

  • 說說Prototypal Inheritance

    摘要:因為是一種長程的關(guān)聯(lián),基類的修改對繼承者的影響難以估計和維護(hù),具有特性,因此從耦合度的角度說,它大大提高了組件的耦合度,高耦合度不是罪過,但它應(yīng)對變化的能力變差了。 JavaScript開發(fā)者的繁殖速度和它的語言特性一樣迅猛,這是好事,但是也把JS搞得比任何一種其他語言都更像流行樂,充滿教派和玄學(xué)。但編程不是玄學(xué),是科學(xué)和工程。這篇文章就用來闡述和探討JavaScript中的一個比較關(guān)...

    jzzlee 評論0 收藏0
  • 深度剖析js原型及面向對象

    摘要:返回一個對象先說一個最常用的方法構(gòu)造函數(shù)獲取所有節(jié)點獲取節(jié)點的長度作用于鏈?zhǔn)秸{(diào)用測試上面的代碼就可以實現(xiàn)的效果因為我沒讀過源碼。 es5版本:(過兩天寫es6 版本的)由淺入深地講,先說使用, function person(age, sex) { this.age = age; this.sex = sex; this.clothes ...

    Corwien 評論0 收藏0
  • JavaScript即學(xué)即用教程[1]-類型系統(tǒng)

    摘要:如圖反而,由于這些的都是繼承自,所以原型鏈拐向了。因此這樣一個實例,他順著原型鏈?zhǔn)钦业搅巳鐖D選學(xué)內(nèi)容如果我們刨根問底,去尋找和的根源的話,那這個問題又稍微有點復(fù)雜了。 基本類型 Number, Boolean, String, null, undefined 什么樣的變量是 undefined 聲明了變量卻沒賦值 未聲明的變量 包裝類型 其實js里面也有像java,c#里所謂的包裝...

    toddmark 評論0 收藏0
  • Mobx 源碼閱讀簡記

    摘要:源碼簡記整體會寫得比較亂,同時也比較簡單,和讀書筆記差不多,基本是邊讀邊寫。見諒主要三大部分的原子類,能夠被觀察和通知變化,繼承于。同時里面有幾個比較重要的屬性與方法。 Mobx 源碼簡記 整體會寫得比較亂,同時也比較簡單,和讀書筆記差不多,基本是邊讀邊寫。見諒~ 主要三大部分Atom、Observable、Derivation Atom Mobx的原子類,能夠被觀察和通知變化,obs...

    paulli3 評論0 收藏0
  • JS 兼容、繼承、bind、this

    摘要:我們都說構(gòu)造函數(shù)開頭首字母大寫但那只是人為的規(guī)定并不是語法。只是一個操作符,任何函數(shù)都能通過來執(zhí)行,并不只是構(gòu)造函數(shù),只不過我們認(rèn)為之后的都是構(gòu)造函數(shù)。 這一篇文章主要是講述一些有關(guān)js的小知識點。因為我也不是很精通哪一方面只能把自己知道的一點點寫出來。取名大雜燴也是這意思吧,既然是道菜那么就來嘗嘗我的手藝吧。 第一道菜 1.首先,我想說一下事件綁定。事件綁定我們都知道有:on + t...

    YacaToy 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<