摘要:時間一晃就是數月,齊云早已把界基本情況了解了,不過至于三座大山里隱藏的謎團卻遲遲沒有頭緒。它是界本源之一。事實上,根本沒有構造函數,或者人人都是構造函數。所以,明白這個界的一界本源,才能在這里暢游天地之間。
自計算機宇宙誕生以來,有很多大神通者在這里開天辟地,開創了很多界,有C、C++、Java等世界,它們彼此相連,其中有一處叫做JavaScript的世界,自被開辟以來吸引了很多修行者來此修煉。JS界由ES、DOM、BOM組成。
話說這一日,齊云道長慕名來到JS界,剛入此界,便被界中三座大山吸引,分別名曰:作用域閉包、原型鏈繼承、異步。相傳此三山中藏著js界的創世本源。道長便在此閉關,靜心感悟。
時間一晃就是數月,齊云早已把js界基本情況了解了,不過至于三座大山里隱藏的謎團卻遲遲沒有頭緒。苦悶之中,坐在山上看日出日落,觀星辰變化。斗轉星移之間,齊云感慨萬物變化奇妙,口中念起了老君的《道德經》:道生一,一生二,二生三,三生萬物,萬物負陰而抱陽。卻突然露出了笑容:“怎么沒早點想到呢,道衍萬物。就是在主宇宙也是生于大道,更何況在這js世界呢”。
相傳當年布蘭登十天造此界,應該也是按照這個思路來的。萬物都從無產生,此界也是無中生有,0和1是計算機宇宙中的陰陽,界中萬物都是由此衍化。再定下八卦五行,此界便可運轉繁衍不息。以往大部分人都是從基本的語法開始感悟,今天我從null開始推演。
了解宇宙本源之后,齊云此時心中有了明悟,仿佛看到了這個世界被創造和不斷完善的樣子。
雖然js經過幾次的升級,擁有更強大的功能,不過最初js只是用來做簡單的數據驗證。。后來在ECMA-262中定義了ES,才提供了核心語言功能。
開天辟地是第一步,這個天地就叫引擎。最早只有創始人布蘭登在網景時開辟的SpiderMonkey,之后諸神又開辟了幾處不同的天地,JScript(IE6,IE7, IE8)、Chakra(IE9,IE10, IE11, IE Edge)、SpiderMonkey(Firefox)、JavaScriptCore(Safari)、V8(Chrome)。不同空間的環境略有不同,但js子民大多可以在這幾處天地下都能生存,只不過生活節奏工作效率不一樣(引擎性能不同)。更有平行天地Node等。天地既有了,便可以創造萬物以及定下此界的規則。萬物由代碼組成,我們不可能一下子把萬物都生成,只需要創造出最基本的元素和種類,之后讓他們衍生萬物。
組成代碼的五行:變量、操作符、控制語句、對象、函數。
變量:不給強制規定類型,可以說是世界最平等的事了,不管你本身什么類型,它都平等對待你,不過麻煩倒也很多。。
函數:創造了不少默認的行為規則,toString()、get()、set()就好像人會吃飯睡覺的行為一樣,被規定的。
這里只是化用五行,僅僅代表最基本的五種元素,并沒有相生相克這些。
基本元素有了,怎么利用這些元素組成無數的代碼,這些代碼又如何豐富世界呢?只有道衍生的規則能辦到,就好像四季更迭,花開花落一般。生與死,對與錯。
規則之一:語法。它規定了區分大小寫、標識符、注釋、嚴格模式、操作符、語句、對象的形式、函數定義。
規則之二:數據類型和數據類型的轉化,好比水變成冰
規則之三:作用域,上下文,閉包。它描述變量存儲的規律,細看js修仙之作用域閉包一文
規則之四:原型鏈規則。它是JS界本源之一。有著名的this規則
規則之五:異步規則。異步操作是為了改善單線程
規則之等等:。。。還有很多規則,例如錯誤處理等。詳看ECMAScript標準
借助八卦,將js中八種事物融合進來,相互配合,組成運轉的JS界。
乾代表引擎,坤代表回收機制,震代表構造函數,巽代表引用類型,坎代表執行語句,離代表編譯器,艮代表異步,兌代表同步。
乾為天,坤為地,離為太陽,坎為月亮,四卦不停準轉有了event loop,有了代碼生成編譯銷毀,事件處理,好比四季循環。之后又有了了震雷,雷動生巽風,雷風相薄,構造函數和引用類型互相影響,艮山兌水,同步異步在event loop中在運轉。
和其他OO世界一樣,JS也是對象的世界。對象擁有著屬性和方法。屬性就是特征,方法就是行為。有了這些對象就能動起來了,仿佛擁有了生命一樣。我們不可能一下子創造出所有的對象,只有先造出第一批對象,它們是JS對象老祖,負責繁衍教化萬民。JS世界對象有自己的特點,它們當中有普通對象和函數對象。函數對象地位較高,屬于一等公民,它們可以被調用,還修行一種獨特的法術,叫做原型之體。原型之體與函數之體通過prototype和constructor相連。本體通過prototype可以獲取原型之體的能力,原型之體則通過constructor表明自己函數之體的身份。
雖然typeof function a(){}返回的是"function"不是"object",這是因為函數確實有一些特殊的屬性,因此用typeof來區分函數和其他對象是有必要的有人說JS中萬物皆對象,事實上是錯誤的,因為(string、boolean、number、number、undefined)本身不是對象,而是基本類型如a=2。
在每個對象中都存在一塊印記,叫[[prototype]],它是對象的血脈之力,有著驚人的作用,當發動血脈之力時,可以發揮先祖之力,甚至可以使出先天對象的法術。有如此大的威力,主要因為對象的[[prototype]]印記連接的是父輩的原型之體!而父輩之體也有屬于自己的血脈之力,因此后輩對象中有遇到自己解決不了的問題時,血脈之力會觸發,幫助它們渡過難關。
有一個特殊的對象Object.prototype,它是這個世界所有對象的智慧之祖,所有的對象都繼承了它的智慧。另一個重要的對象是Function.prototyp,它擁有了關于函數對象的智慧,并且它也繼承了Object.prototype的智慧。這兩個對象我稱它們為先天對象,是JS根基對象,它們高高在上,是萬象之根。而且它們是Object和Function對象的原型之體,神通廣大,原型之體術就是它們最先練就。Function掌管著函數對象,Object掌管著原型之體和普通對象。幾乎所有的函數都是引用類型Function的實例,幾乎所有的對象都是Object的實例Function.prototype繼承了Object.prototype(雖然會出現覆蓋),Object的血脈又連接Function,可以說這兩位是其他JS對象共同的老祖。
Function.prototype.__prototype === Object.prototype Object.__prototype === Function.prototype
在某對象中找不到要找的屬性時,就會沿著原型鏈網上找。從ECMAScript6開始,[[Prototype]]可以通過Object.getPrototypeOf()和Object.setPrototypeOf()訪問器來訪問,這個等同于JS的非標準但許多瀏覽器實現的屬性__proto__
全局的Function對象沒有自己的屬性和方法,繼承于Function.prototype,因此Function.prototype是不能被修改的。Function.prototype還有個特殊的身份,它也是個函數,簡直是深藏不露。
console.log(Function.prototype) [Function]
剩下的一些對象組成了長老會,它們分別是Array、Date、RegExp、String、Math、Error等,以及后面加入的Set、Map等幾位長老。長老們擁有各自的神通和家族。例如Array長老擅長操作數組,有sort、slice等神通,而Math長老有random神通。不過它們也都是Object和Fucntion的部下。每個長老的函數之體源自Function,繼承了Function.prototype的神通。而它們的原型之體繼承了Object.prototype的智慧。
對象是引用類型的實例,通過new加構造函數可以創造新對象,后來先天對象Object又感悟了Object.create之法,也可以創造新的對象。
事實上,根本沒有構造函數,或者人人都是構造函數。當且僅當使用new時,函數調用會變成構造函數調用。
JS界的老祖,長老會及長老會門下關系如下:
可以看到兩位老祖高高在上,受萬眾仰視。它們與多位長老一樣,函數體通過藍色箭頭prototype指向原型之體。原型之體通過灰色線constructor連接函數之體,后代子孫而血脈之力由[[prototype]]沿著橙色線,找到了父對象(構造函數)的原型之體,父對象或長老們的原型之體的血脈是綠色的線,指向了Object.prototype。
duke.__proto__ === Sub.prototype Sub.prototype.__proto__ = == Object.prototype ------------------------------------------------- Sub.__proto__ === Function.prototype Function.prototype.__proto__ === Object.prototype
至此,道長把感悟記錄在《齊云札記》里,并這么歸納:
1.所有對象都有隱式原型[[prototype]],它指向了創造它的構造函數的原型對象,一直連接到Object.prototype,而Object.prototype也有隱式原型,而它指向Null,當訪問一個對象的屬性找不到時,會沿原型鏈向上找,找到了會返回,找不到就會繼續向上知道null會返回undefined。
2.幾乎所有函數都是Function的實例,為了符合這個規則,Function的隱式原型指向的是它的原型對象。
易是包羅萬象,一切事物和現象都可以裝進這個模式里,易是變化的,不管代碼如何復雜,都是符合最基本的規則,易雖然變化,但大道是永恒的,變化之道是不變的。JS的世界也是這樣,不管由多復雜的代碼組成的程序,也都得遵循最基本的變量聲明語法,也要符合原型的設計模式,也都得按照既定的規則來編寫。所以,明白這個JS界的一界本源,才能在這里暢游天地之間。
個人域名:https://chenshaotang.com
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/101110.html
摘要:百煉成仙走紅該書于年月出版,作者楊逸飛是一名從事開發六年的程序員,寫過諸多技術博客。作者在博客上對粉絲提出關于百煉成仙的問題進行了統一回復,該博文持續占據熱榜第二,熱度達。 剛接觸編程的小伙伴,估計都想過把枯燥無聊的編程教材變成小說讀的念頭,這不,說曹操曹操就來了,真的有程序員用寫修仙小說的...
摘要:既然這么好,為什么就一直沒火起來呢我看周圍基本上沒人用,比較好的論文開源出的代碼也沒見到。這次不遺余力的宣傳,連帶推動了整個的火熱。現狀是散修小團體一起合力做出來的平臺。這個是較大的特色。根據作者的平臺排名,目前屬于第四,前三分別是,,。 看了下mxnet,覺得很厲害的,支持各個流行的平臺,支持多種語言,支持多機多GPU并行。相比起來,caffe就沒這么好的支持的。既然這么好,為什么mxne...
摘要:散列表用的是數組支持按照下標隨機訪問數據的特性,所以散列表其實就是數組的一種擴展,由數組演化而來。我們可以把它定義成,其中表示元素的鍵值,的值表示經過散列函數計算得到的散列值。 showImg(https://segmentfault.com/img/remote/1460000018521371?w=833&h=1096); 祝愿大家不要像菜菜這般苦逼,年中獎大大滴在沒有年終獎的日子...
摘要:可見快速排序不是穩定的排序。在這種小數組的情況下,其實一些基礎排序算法反而比快速排序要快。當一個數組為無序并且重復元素不多時候,也適合快速排序。 分治思想 關于排序,江湖盛傳有一種分治思想,能大幅度提高排序心法的性能。所謂分治,即:化大為小,分而治之。達到治小而治大的成效。多年來基于分治思想衍生出多種排序心法,然萬變不離其宗!雖然江湖上算法內功繁多,但是好的算法小編認為必須符合以下幾...
摘要:可見快速排序不是穩定的排序。在這種小數組的情況下,其實一些基礎排序算法反而比快速排序要快。當一個數組為無序并且重復元素不多時候,也適合快速排序。 分治思想 關于排序,江湖盛傳有一種分治思想,能大幅度提高排序心法的性能。所謂分治,即:化大為小,分而治之。達到治小而治大的成效。多年來基于分治思想衍生出多種排序心法,然萬變不離其宗!雖然江湖上算法內功繁多,但是好的算法小編認為必須符合以下幾...
閱讀 3611·2021-11-15 11:38
閱讀 2807·2021-11-11 16:55
閱讀 2557·2021-11-08 13:22
閱讀 2633·2021-11-02 14:45
閱讀 1314·2021-09-28 09:35
閱讀 2589·2021-09-10 10:50
閱讀 468·2019-08-30 15:44
閱讀 2783·2019-08-29 17:06