理解JavaScript中的原型繼承(2)

兩年前在我學習JavaScript的時候我就寫過兩篇關于原型繼承的博客:

理解JavaScript中原型繼承

JavaScript中的原型繼承

這兩篇博客講的都是原型的使用,其中一篇還有我學習時的錯誤理解。今天看《Understanding Scopes》這讓我從新思考了一下原型繼承,更重要的是站在一個繼承設計者的角度再看一下原型繼承。

在傳統的面向類的繼承體系中,我們有個Best Practices是優先使用(對象)組合代替(類)繼承,而原型繼承是這個思想的一個運用。和面向對象和函數式編程一樣,使用幾乎任何語言都可以實現這樣的思想,我以前學的只是這個思想的一個JavaScript實現,而已。

基于原型的繼承其實是一種組合式的繼承,樸素的說法就是子域中屬性找不到的話就去父域中找找,這里的父域是用原型(__proto__)去引用的,依次遞歸整個原型鏈。最終的實現其實就是對象的組合。子對象包含父對象的引用。既然是繼承必然涉及到重名問題,子對象和父對象各自相當于一個作用域,重名問題的處理也是就近(可覆蓋shadow/隱藏hide)原則,即子作用域的同名屬性會起作用,隱藏了父作用域的同名屬性,但是由于是組合,這兩個屬性是獨立的。我們用偽代碼看看:

aParent = {name:’jerry’}

aChild = {__proto__:aParent, name:’frank’}

aChild中的name和aParent中的name是各自獨立的。我們aChild.name=’unknown’并不會改變aParent.name。

?

有一點要拿出單獨說說,造成迷糊的最大根源就是誤解,對于如下代碼:

aParent = {name:’jerry’}

aChild = {__proto__:aParent}

若我們取aChild.name的值,我們很容易resolve,那就是子域中找不到,去父域中找,找到了jerry。但是對于:aChild.name = ‘frank’這樣的賦值代碼我們會產生歧義(ambiguous),我們可能有兩中含義:

1,更新父域中的name屬性為frank。

2,設置子域中的name屬性為frank。

JavaScript選用的方式是第2種。即設置(新建)子域自己的name屬性為frank,并隱藏了父域中的name屬性。我們通常誤以為JavaScript是按1的方式工作,其實不是。

?

另外類(模版)其實在編程語言的實現中是可有可無的,像JavaScript壓根就沒有類(模版),他只有對象,new Point()只不過是一個語法糖,跟aObj = createObject()是一樣的,只是調用一個方法去生成一個對象,而已。

轉載于:https://www.cnblogs.com/Jerry-Chou/p/understanding-prototype-inheritance-2.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/248468.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/248468.shtml
英文地址,請注明出處:http://en.pswp.cn/news/248468.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

深入Vue原理_全面剖析發布訂閱模式

文章目錄發布訂閱模式優化優化思路思考理解發布訂閱模式(自定義事件)收集更新函數觸發更新函數6.5 總結總結寫在最后本期推薦歡迎各位小伙伴們! 為大家推薦一款刷題神奇哦 點擊鏈接訪問牛客網 各大互聯網大廠面試真題。從基礎到入階乃至原理刨析類面試題 應有盡有&a…

前端面試系列-JS 異步編程

并發與并行的區別? 并發是宏觀概念,我分別有任務 A 和任務 B,在一段時間內通過任務間的切換完成了這兩個任務,這種情況就可以稱之為并發。并行是微觀概念,假設 CPU 中存在兩個核心,那么我就可以同時完成任務…

web前端發展歷程

總覽前端發展史前言瀏覽器的發展史走進前端HTMLCSSjavaScript小前端時代大前端時代寫在最后前言 目前在IT公司中前端的崗位越來越成為不可或缺的,前端的地位也愈見明顯,很多學校已經體系的傳授前端課程,眾多培訓機構也將前端知識作為了主流課…

修改wordpress上傳文件大小限制

1. 登陸wordpress使用的數據庫,切換到使用的database 2. 操作如下: > select meta_key from wp_sitemeta; > select meta_key,meta_value from wp_sitemeta where meta_keyfileupload_maxk; 修改為20M: > update wp_sitemeta set meta_value204…

php的符號的排序大小

轉載于:https://www.cnblogs.com/cjjjj/p/10433334.html

淺談 HTTP 和 HTTPS

很多前端伙伴問題有沒有體系的面試題? 今天為大家推薦一款刷題神奇哦 點擊鏈接訪問牛客網 各大互聯網大廠面試真題。從基礎到入階乃至原理刨析類面試題 應有盡有,趕快來裝備自己吧!助你面試穩操勝券,solo全場面試官 淺談 HTTP 和 …

Ubuntu 搭建 GitLab 筆記 ***

簡介 GitLab 社區版可以提供許多與 GitHub 相同的功能,且部署在屬于自己的機器上,我們會因為網絡及其他一些問題而不便使用 GitHub ,這時部署一個 GitLab 是最好的選擇。 下載 GitLab 并安裝 我的環境是 Ubuntu 16.04 下進行部署操作。 GitLa…

在瀏覽器輸入URL到頁面展示發生了什么?

輸入URL后查詢緩存DNS服務器TCP三次握手HTTP協議包瀏覽器處理HTML文檔TCP 和 UDP 的區別寫在最后很多前端伙伴問題有沒有體系的面試題? 今天為大家推薦一款刷題神奇哦 點擊鏈接訪問牛客網 各大互聯網大廠面試真題。從基礎到入階乃至原理刨析類面試題 應有盡有&#…

iOS 高級去水印,涂鴉去水印

目前在研究一下圖像的處理,看了一下相關的軟件,比如:《去水印大師》,究竟去水印是怎么處理的呢?看圖分析。 一共是三個功能:快速去水印、高級去水印、涂鴉去水印 快速去水印:暫時沒找到好的處理…

Failed to execute goal maven-gpg-plugin 1.5 Sign

問題描述&#xff1a; 解決辦法&#xff1a;跳過maven-gpg-plugin <build> <pluginManagement><plugins><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-gpg-plugin</artifactId><configuration&g…

打造硬核敲門磚——簡歷

文章目錄 前言打造簡歷篇幅模板個人信息專業技能工作經歷項目經歷教育經歷個人總結簡歷格式寫在最后前言 作為高校的學生,你是否已經開始設想你以后的工作?作為職場的員工,你是否已經準備更換下一份工作了?不論你現在是什么身份、處于什么階段,這篇文章都能夠幫到你,只要…

Robot Framework 內置變量

Robot Framework 內置變量 轉自&#xff1a;https://blog.csdn.net/qq_26886929/article/details/53907755 Robot Framework 內部提供了一下直接可用的內置變量 1. 操作系統相關變量 內置的操作系統相關的變量&#xff0c;減少了測試數據對操作系統之間的差異性的關注 RF 中可用…

一文搞懂this指向

前言 那你說一下 js 中的 this 指向吧&#xff01;這句話已經成為面試官口中的高頻面試題&#xff0c;作為前端開發的我們&#xff0c;你真的搞懂了 this 指向了嗎&#xff1f;快來跟我一起來查漏補缺吧&#xff01;通過幾個小案例讓大家更能直白的理解 this 指向。 很多前端伙…

難怪大家丟掉了postman而選擇 Apifox

前言 當下采用前后端分離模式開發Web應用已經成為氣候&#xff0c;在開發階段有一個不成文的規定則是 項目開發后端先行 但是作為前端開發工程師的我們&#xff0c;難道在搭建完頁面后只能等待后端的接口么&#xff1f;這樣的話我們則完全被后端開發限制住了。在前面跟大家介紹…

mvc 模式和mtc 模式的區別

首先說說Web服務器開發領域里著名的MVC模式&#xff0c;所謂MVC就是把Web應用分為模型(M)&#xff0c;控制器(C)和視圖(V)三層&#xff0c;他們之間以一種插件式的、松耦合的方式連接在一起&#xff0c;模型負責業務對象與數據庫的映射(ORM)&#xff0c;視圖負責與用戶的交互(頁…

HP LaserJet MFP M227_M231雙面打印

雙面打印設置 轉載于:https://www.cnblogs.com/xiexiaokui/p/9261577.html

萬木成林,我種了“Vue技能樹”

初衷 作為Vue技能樹的構建者&#xff0c;一直拖延到現在才來寫這篇文章&#xff0c;主要還是心里沒有底&#xff0c;前面殊不知這顆“樹”是否促進了大家學習的熱情&#xff0c;也不知它給大家帶來了多少收獲。說到我們的Vue技能樹&#xff0c;我作為尤大大的忠實粉絲自就業后…

我看面向對象

已經面向對象編程多年了&#xff0c;漸漸地對面向對象有了越來越深的體會&#xff0c;下面談談我對面向對象的拙見&#xff1a;&#xff09; 面向對象三大特性&#xff1a;封裝、繼承、多態。 首先是封裝&#xff0c;我覺得封裝是面向對象的基礎&#xff0c;封裝讓各種相關的數…

poj 3525

多邊形內最大半徑圓。 哇沒有枉費了我自閉了這么些天&#xff0c;大概五天前我看到這種題可能毫無思路抓耳撓腮舉手投降什么的&#xff0c;現在已經能1A了哇。 還是先玩一會計算幾何&#xff0c;刷個幾百道 嗯這個半平面交二分就闊以解決。雖然隊友說他施展三分套三分***** 想象…

尤雨溪對 2022 Web前端生態趨勢是這樣看的

文章目錄前言開發范式&底層框架方面趨勢基于依賴追蹤范式基于依賴追蹤范式—共同點基于編譯的響應式系統統一模型的優勢和代價基于編譯的運行是優化Vue Vapor Mode&#xff08;input&#xff09;工具鏈原生語言在前端工具鏈中的使用工具鏈的抽象層次基于 Vite 的上層框架上…