JavaScript繼承

来源:http://www.cnblogs.com/wuyongyu/archive/2016/08/13/5769081.html
-Advertisement-
Play Games

很久之前就看了有關JavaScript繼承,都沒怎麼總結,剛好今天有空就來聊聊唄 (^o^)/ 通過不斷試驗 來檢驗自己理解的正確性。 首先JavaScript裡面所有的數據類型都是對象(object),其中的new命令引入Javascript,用來從原型對象生成一個實例對象。 (這裡請註意:在Ja ...


      很久之前就看了有關JavaScript繼承,都沒怎麼總結,剛好今天有空就來聊聊唄 (^o^)/

  通過不斷試驗 來檢驗自己理解的正確性。


 

  首先JavaScript裡面所有的數據類型都是對象(object),其中的new命令引入Javascript,用來從原型對象生成一個實例對象。

  (這裡請註意:在JavaScript中,new命令後面跟的是構造函數)

  1、new運算符

  用構造函數生成實例對象,有一個缺點,那就是無法共用屬性和方法。

  舉個慄子:在Man對象的構造函數中,設置一個實例對象的共有屬性species。

   function Man(name){
     this.name = name;
     this.species = "男人";
   }

  然後,我生成兩個實例對象

   var manA = new Man("Yori");
   var manB = new Man("bentos");

  這兩個對象的species屬性是獨立的,修改其中一個,不會影響到另一個

   manA.species = "超人";
   alert(manB.species); // 彈窗顯示"男人",不受manA的影響 

  這說明,每一個實例對象,都有自己的屬性和方法的副本,他們之間不僅無法做到數據共用,而且對資源造成浪費

 

   2、prototype屬性

  構造函數有一個prototype屬性,這個屬性包含一個對象(以下簡稱"prototype對象"),

  所有實例對象需要共用的屬性和方法,都放在prototype對象裡面,

  那些不需要共用的屬性和方法,就放在構造函數裡面。

  再舉個慄子:以Man構造函數為例,現在用prototype屬性進行改寫

   function Man(name){
     this.name = name;
   };

Man.prototype
= { species : "男人" };
var manA = new Man("Yori"); var manB = new Man("bento"); alert(manA.species); // 男人 alert(manB.species); // 男人

  因為 species屬性放在prototype對象里,是兩個實例對象共用的。所以只要我修改了prototype對象,就會同時影響到兩個實例對象

   Man.prototype.species = "超人";

   alert(manA.species); // 超人
   alert(manB.species); // 超人

 

    3、構造函數的繼承

  現在有一個"人類"對象的構造函數

   function Human(){
     this.species = "人類";
   }

  還有一個"男人"對象的構造函數

   function Man(name){
     this.name = name;
   }

  怎樣才能使"男人"繼承"人類"呢?

  (1)構造函數綁定

    使用apply方法,將父對象的構造函數綁定在子對象上

    就想舉慄子:在子對象構造函數中加一行

    function Man(name){
     Human.apply(this, arguments);
     this.name = name;
   }
   var manA = new Man("Yori");
   alert(manA.species); // 人類

    (apply方法重新定義了函數的執行環境,即改變this的指向)

 

   (2)prototype模式

    使用prototype屬性,如果"男人"的prototype對象,指向一個Human實例,那麼所有"男人"的實例,就能繼承Human了

    慄子如下:我將Man的prototype對象指向一個Human的實例

   Man.prototype = new Human();
   Man.prototype.constructor = Man;
   var manA = new Man("Yori");
   alert(manA.species); // 人類

   註意:任何一個prototype對象都有一個constructor屬性,指向它的構造函數。

        因此我才將Man.prototype對象的constructor值改為Man,即 把這個屬性指回原來的構造函數

 

  4、非構造函數繼承

  現在有一個"人類"的對象

  var Human = {
     species : "人類"
   }

  還有一個"男人"的對象

  var Man = {
     name : "Yori"
  }

  怎樣才能使"男人"繼承"人類"呢?

  (1)object()方法

    使用object()函數,把子對象的prototype屬性,指向父對象,從而使得子對象與父對象連在一起

    又來慄子:首先我會寫出object()函數

  function object(o) {
    function F() {}
    F.prototype = o;
    return new F();
  }

    使用的時候,先在父對象的基礎上,生成子對象,然後再加上子對象本身的屬性

  var Man = object(Human);

  Man.name = "Yori";

  alert(Man.species); // 人類

    可以看出,子對象已經繼承了父對象的屬性了。

 

    未完待續》》

  


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

-Advertisement-
Play Games
更多相關文章
  • 一、單個controller範圍的異常處理 說明: 在controller中加入被@ExceptionHandler修飾的類即可(在該註解中指定該方法需要處理的那些異常類) 該異常處理方法只在當前的controller中起作用 二、全部controller範圍內起作用的異常處理(全局異常處理) 1、 ...
  • 為什麼需要非同步?why?來看一段代碼。 問題1: for(var i=0;i<100000;i++){ } alert('hello world!!!'); 這段代碼的意思是執行100...次後再執行alert,這樣帶來的問題是,嚴重堵塞了後面代碼的執行,至於為什麼,主要是因為JS是單線程的。 問題 ...
  • 各位好啊,我又和大家見面了,也許你已經不記得大明湖畔的容嬤嬤,但是只要記得博客園中的我就好,希望我的博客能像一股清風,為你驅散炎熱的酷暑,好了,廢話不多說,開始上乾貨,我今天帶給大家的是前端工程化開發yeoman,bower ,grunt . 關於這三個工具在這裡就不過多介紹了,沒有用過的散仙們可以 ...
  • 在公司中使用nodejs構建代理伺服器實現前後臺分離,代碼不能拿出來,然後出現httpProxy代理資源的時候老是出現404.明明被代理的介面是存在的。代碼大概如下: 然後報錯或者是404錯誤碼。 解決方案: 在代理請求中,把請求頭中的host給刪除,改進代碼如下: 然後如期運行正確。 http:/ ...
  • 一些常見的狀態碼為: 200 - 伺服器成功返回網頁 404 - 請求的網頁不存在 503 - 服務不可用 所有狀態解釋: 1xx(臨時響應)表示臨時響應並需要請求者繼續執行操作的狀態代碼。代碼 說明 100 (繼續) 請求者應當繼續提出請求。 伺服器返回此代碼表示已收到請求的第一部分,正在等待其餘 ...
  • Range對象基本用法 效果圖如下(在谷歌瀏覽器下的展示) 代碼如下 在火狐瀏覽器下的展示 為什麼會出現這種情況呢,因為火狐瀏覽器下可以針對不連續的內容多選. Range對象之SelectNode和selectNodeContents方法 效果圖如下 代碼內容如下: selectNodeConten ...
  • 本篇介紹如何創建一個ExtJS應用程式。並通過創建目錄、導入文件、編寫代碼及分析代碼等步驟來解釋第一個ExtJS程式。 ...
  • 最近在刷 fcc的題,跟升級打怪一樣,一關一關的過,還挺吸引我的。今天抽時間把 Basic Algorithm Scritping 這部分題做了,根據一些提示,還是比較簡單的。有些題的處理方式 方法,我想值得借鑒。比如在項目中有時候要處理一個字元,如果想不到一些相關的方法,還挺費事的,所以,在此記錄 ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...