原型、原型鏈與繼承

来源:http://www.cnblogs.com/bsblogs/archive/2017/11/03/7780869.html
-Advertisement-
Play Games

面試中經常考到面向對象的一些知識,在這記錄一下,如有不對歡迎指正,願在前端的道路上共勉! 一、原型 1.什麼是原型: 簡單說就像css的class一樣,是公用的,給DOM元素加個class名就可以公用樣式,那麼原型就相當於css裡面的class,都可以用。 在構造函數創建出來的時候,系統會預設的幫構 ...


面試中經常考到面向對象的一些知識,在這記錄一下,如有不對歡迎指正,願在前端的道路上共勉!

一、原型

1.什麼是原型:  簡單說就像css的class一樣,是公用的,給DOM元素加個class名就可以公用樣式,那麼原型就相當於css裡面的class,都可以用。

       在構造函數創建出來的時候,系統會預設的幫構造函數創建並關聯一個神秘的對象,這個對象就是原型,構造函數的每一個實例都可以訪問原型中的成員(一般我們放方法);

2.原型鏈:(原型鏈這個概念常考哦~)  首先呢,正如上面所說的,當函數被new操作符調用時,會創建出一個對象,並且該對象中會有一個指向其原型對象的秘密鏈接(一個非標準屬性:_proto_),這樣新建的對象(實例)就可以調用相關原型對象中的成員;(咳咳,正題來了哈)但是,原型對象自身也具有對象固有的普遍特征(它也是個對象),因此,也包含了指向其原型對象的鏈接,因此嘞,就形成了一個鏈式結構,稱之為原型鏈;

       請原諒我畫畫的技術:

 

二、繼承

1.那麼什麼又是繼承呢:其實就是一個對象沒有的成員,但是另一個對象有,給它拿過用;(在現實世界中這好像叫‘借’吧)

2.繼承的過程:(這裡引用blue老師的一個比喻)  你媳婦他媽跟你要100萬,你沒有咋辦?找你爹,你爹也沒有,咋整?找你爹的爹,但是你爹的爹的爹死了,所以你爺爺說家裡沒有,也就是返回null;(其實寫到這裡我內心是崩潰的)

3.繼承方式:

 1 //1.混入式繼承,說是混入式有點高大上,其實就是遍歷賦值
 2         function Person(){
 3 
 4         }
 5 
 6         let obj = { 
 7             name:'jack',
 8             age:'18',
 9             sayHello:function(){
10                 console.log('你好,我是'+this.name);
11             }};
12 
13         for( let k in obj){
14             //判斷一下obj中的k是不是自己的,當然這不是咱們這篇文章主要研究的
15             if(obj.hasOwnProperty(k)){
16                 //這種不會破壞原型中的constructor的指向
17                 Person.prototype[k] = obj[k];
18             }
19         }
20 
21 
22 
23         //2.經典繼承
24         Person.prototype = Object.create(obj);
25         
26         //上面的代碼相當於
27         function create(obj){
28             function P(){};
29             P.prototype = obj;
30             return new P();
31         }    
32 
33 
34         //3.借用構造函數,這種方法繼承不過去
35         function Person(name,age){
36             this.name = name;
37             this.age = age;
38         }
39 
40         Person.prototype.sayHello = function(){
41             console.log('你好,我是'+this.name);
42         }
43 
44         function Human(name,age){
45             Person.apply(this,arguments);
46         }
47 
48         let p = new Human('jack',18);
49         console.log(p); 
50         p.sayHello();  //p.sayHello is not a function
51 
52 
53 
54         //4.直接替換,會改變obj1的constructor的指向
55         obj1.prototype = obj2.prototype;

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 描述 本篇文章簡要推薦一些常用技術博客網站 1 內容區 1 內容區 2 版權區 2 版權區 感謝您的閱讀,若有不足之處,歡迎指教,共同學習、共同進步。 博主網址:http://www.cnblogs.com/wangjiming/。 極少部分文章利用讀書、參考、引用、抄襲、複製和粘貼等多種方式整合而 ...
  • 經常遇到C#調用webservice的情況,通常來說如果webservice是用vs+c#來開發的,問題一般來說不大,直接web引用,然後調用就OK了。流程如下: 下麵就是進行調用,就這麼簡單。 但如果webservice是用JAVA或者其它語言或者其它工具生成的話,使用vs+c#來調用就經常遇到問 ...
  • 要在select標簽上面加上autocomplete="off"關閉自動完成,不然瀏覽器每次刷新後將自動選擇上一次關閉時的option,這樣預設屬性selected="selected"就會失效啦 要記住每次遇到select標簽時就最好要加上autocomplete="off"這一項 ...
  • 瞭解瞭解 ECharts,縮寫來自Enterprise Charts,商業級數據圖表,一個純Javascript的圖表庫,可以流暢的運行在PC和移動設備上,相容當前絕大部分瀏覽器(IE6/7/8/9/10/11,chrome,firefox,Safari等),底層依賴輕量級的Canvas類庫ZRen ...
  • 瞧這首頁報錯報的 ...
  • 簡介 form的enctype屬性為編碼方式,常用有兩種:application/x-www-form-urlencoded和multipart/form-data,預設為application/x-www-form-urlencoded。 當action為get時候,瀏覽器用x-www-form- ...
  • 1. 全局安裝webpack cnpm install --save-dev webpack 2. 初始化 cnpm init cnpm install --save-dev webpack 創建項目目錄( dist為生成目錄 ) 3. 配置文件 webpack.config.js 創建main.j ...
  • 今天在使用滑鼠事件時,用錯了mouseout,於是做個測試總結。 結論: mouseenter:當滑鼠移入某元素時觸發。 mouseleave:當滑鼠移出某元素時觸發。 mouseover:當滑鼠移入某元素時觸發,移入和移出其子元素時也會觸發。 mouseout:當滑鼠移出某元素時觸發,移入和移出其 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...