摘要:今天閑來無事,看見幾行小字。又說所有對象,繼承終是。強行押韻一波這首詩的意思就是說的我今天沒有什么事情,然后無意中又在網(wǎng)上看到了任何對象都是從對象繼承而來的這句話。一時興起,便去驗證這句話。
今天閑來無事,看見幾行小字。
又說所有對象,繼承終是Obj。
—— 強行押韻一波
這首詩的意思就是說的我今天沒有什么事情,然后無意中又在網(wǎng)上看到了“任何對象都是從Object對象繼承而來的”這句話。一時興起,便去驗證這句話。ps. 我好像從來在原型鏈上面都沒有走到過Object對象,我今天一定要把它點出來!
首先我們從《JavaScript高級程序(第三版)》里面找到這張圖
此圖片告訴了我們2個道理:
1、一個實例的 [[Prototype]] (__proto__屬性),指向它構造函數(shù)的原型對象 這句話聽起來有點兒復雜,把它簡化一下 一個實例的__proto__屬性,指向它的原型對象 2、一個原型對象的constructor屬性又指回了這個對象
下面我們來console一下ES5構造函數(shù)和ES6類的__proto__、prototype
1、es5 和 es6 這兩個實例的__proto__ 指向了它們構造函數(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準備開始打印") 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 指向了它們的構造函數(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、構造函數(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
所以推導出
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
下面我要開始開車了
準備好了嗎?嘟嘟,嘟嘟。嘟嘟,嘟嘟。
首先打印出Function對象本身,看看是什么便于后面參考
//Node 下面的執(zhí)行結(jié)果 console.log(Function) //[Function: Function]
ES6Class的構造函數(shù)是 Function對象
//Node 下面的執(zhí)行結(jié)果 console.log(ES6Class.constructor) //[Function: Function] console.log(ES6Class.constructor === Function) //true
ES6Class的__proto__ 當然也就指向它構造函數(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 沒有指向它的構造函數(shù)而是指向了它本身(或者說Function的構造函數(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 指向它本身,不指向它的構造函數(shù)(或者說Function的構造函數(shù)就是它本身)這個我也不太清楚
2、Function.__proto__.__proto__.constructor === Object
console了這么多東西,我先去廁所吐了,兄弟們點個贊再走
文章版權歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/106249.html
摘要:因為是一種長程的關聯(lián),基類的修改對繼承者的影響難以估計和維護,具有特性,因此從耦合度的角度說,它大大提高了組件的耦合度,高耦合度不是罪過,但它應對變化的能力變差了。 JavaScript開發(fā)者的繁殖速度和它的語言特性一樣迅猛,這是好事,但是也把JS搞得比任何一種其他語言都更像流行樂,充滿教派和玄學。但編程不是玄學,是科學和工程。這篇文章就用來闡述和探討JavaScript中的一個比較關...
摘要:返回一個對象先說一個最常用的方法構造函數(shù)獲取所有節(jié)點獲取節(jié)點的長度作用于鏈式調(diào)用測試上面的代碼就可以實現(xiàn)的效果因為我沒讀過源碼。 es5版本:(過兩天寫es6 版本的)由淺入深地講,先說使用, function person(age, sex) { this.age = age; this.sex = sex; this.clothes ...
摘要:如圖反而,由于這些的都是繼承自,所以原型鏈拐向了。因此這樣一個實例,他順著原型鏈是找到了如圖選學內(nèi)容如果我們刨根問底,去尋找和的根源的話,那這個問題又稍微有點復雜了。 基本類型 Number, Boolean, String, null, undefined 什么樣的變量是 undefined 聲明了變量卻沒賦值 未聲明的變量 包裝類型 其實js里面也有像java,c#里所謂的包裝...
摘要:源碼簡記整體會寫得比較亂,同時也比較簡單,和讀書筆記差不多,基本是邊讀邊寫。見諒主要三大部分的原子類,能夠被觀察和通知變化,繼承于。同時里面有幾個比較重要的屬性與方法。 Mobx 源碼簡記 整體會寫得比較亂,同時也比較簡單,和讀書筆記差不多,基本是邊讀邊寫。見諒~ 主要三大部分Atom、Observable、Derivation Atom Mobx的原子類,能夠被觀察和通知變化,obs...
摘要:我們都說構造函數(shù)開頭首字母大寫但那只是人為的規(guī)定并不是語法。只是一個操作符,任何函數(shù)都能通過來執(zhí)行,并不只是構造函數(shù),只不過我們認為之后的都是構造函數(shù)。 這一篇文章主要是講述一些有關js的小知識點。因為我也不是很精通哪一方面只能把自己知道的一點點寫出來。取名大雜燴也是這意思吧,既然是道菜那么就來嘗嘗我的手藝吧。 第一道菜 1.首先,我想說一下事件綁定。事件綁定我們都知道有:on + t...
閱讀 2829·2021-09-10 10:50
閱讀 2192·2019-08-29 16:06
閱讀 3194·2019-08-29 11:02
閱讀 1093·2019-08-26 14:04
閱讀 2802·2019-08-26 13:24
閱讀 2300·2019-08-26 12:16
閱讀 550·2019-08-26 10:29
閱讀 3094·2019-08-23 18:33