原型、原型鏈與繼承

来源: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
  • 示例項目結構 在 Visual Studio 中創建一個 WinForms 應用程式後,項目結構如下所示: MyWinFormsApp/ │ ├───Properties/ │ └───Settings.settings │ ├───bin/ │ ├───Debug/ │ └───Release/ ...
  • [STAThread] 特性用於需要與 COM 組件交互的應用程式,尤其是依賴單線程模型(如 Windows Forms 應用程式)的組件。在 STA 模式下,線程擁有自己的消息迴圈,這對於處理用戶界面和某些 COM 組件是必要的。 [STAThread] static void Main(stri ...
  • 在WinForm中使用全局異常捕獲處理 在WinForm應用程式中,全局異常捕獲是確保程式穩定性的關鍵。通過在Program類的Main方法中設置全局異常處理,可以有效地捕獲並處理未預見的異常,從而避免程式崩潰。 註冊全局異常事件 [STAThread] static void Main() { / ...
  • 前言 給大家推薦一款開源的 Winform 控制項庫,可以幫助我們開發更加美觀、漂亮的 WinForm 界面。 項目介紹 SunnyUI.NET 是一個基於 .NET Framework 4.0+、.NET 6、.NET 7 和 .NET 8 的 WinForm 開源控制項庫,同時也提供了工具類庫、擴展 ...
  • 說明 該文章是屬於OverallAuth2.0系列文章,每周更新一篇該系列文章(從0到1完成系統開發)。 該系統文章,我會儘量說的非常詳細,做到不管新手、老手都能看懂。 說明:OverallAuth2.0 是一個簡單、易懂、功能強大的許可權+可視化流程管理系統。 有興趣的朋友,請關註我吧(*^▽^*) ...
  • 一、下載安裝 1.下載git 必須先下載並安裝git,再TortoiseGit下載安裝 git安裝參考教程:https://blog.csdn.net/mukes/article/details/115693833 2.TortoiseGit下載與安裝 TortoiseGit,Git客戶端,32/6 ...
  • 前言 在項目開發過程中,理解數據結構和演算法如同掌握蓋房子的秘訣。演算法不僅能幫助我們編寫高效、優質的代碼,還能解決項目中遇到的各種難題。 給大家推薦一個支持C#的開源免費、新手友好的數據結構與演算法入門教程:Hello演算法。 項目介紹 《Hello Algo》是一本開源免費、新手友好的數據結構與演算法入門 ...
  • 1.生成單個Proto.bat內容 @rem Copyright 2016, Google Inc. @rem All rights reserved. @rem @rem Redistribution and use in source and binary forms, with or with ...
  • 一:背景 1. 講故事 前段時間有位朋友找到我,說他的窗體程式在客戶這邊出現了卡死,讓我幫忙看下怎麼回事?dump也生成了,既然有dump了那就上 windbg 分析吧。 二:WinDbg 分析 1. 為什麼會卡死 窗體程式的卡死,入口門檻很低,後續往下分析就不一定了,不管怎麼說先用 !clrsta ...
  • 前言 人工智慧時代,人臉識別技術已成為安全驗證、身份識別和用戶交互的關鍵工具。 給大家推薦一款.NET 開源提供了強大的人臉識別 API,工具不僅易於集成,還具備高效處理能力。 本文將介紹一款如何利用這些API,為我們的項目添加智能識別的亮點。 項目介紹 GitHub 上擁有 1.2k 星標的 C# ...