原型鏈相關介紹

来源:http://www.cnblogs.com/brightking/archive/2016/08/03/5734497.html
-Advertisement-
Play Games

1. Object.createde 方法 是ES5中引入的方法,語法: 功能:實現繼承,創建一個 原型繼承 自參數對象,但是缺點是,不能實現復用 例如: 2. 對象的原型鏈 凡是對象就有原型,那麼原型又是對象,因此凡是定義一個對象,那麼就可以找到他的原型,原型還有原型, 那麼如此下去,就構成一個對 ...


1. Object.createde 方法

是ES5中引入的方法,語法:

    Object.create(對象) -> 新對象

功能:實現繼承,創建一個 原型繼承 自參數對象,但是缺點是,不能實現復用

例如:

    var o = {
        sayHello: function () { console.log( '你好' ); }
    };

    var o1 = Object.create( o );
    // 創建一個新對象 o1, 該新對象的原型即 __proto__ 就是 o

2. 對象的原型鏈

  1. 凡是對象就有原型
  2. 原型也是對象

凡是對象就有原型,那麼原型又是對象,因此凡是定義一個對象,那麼就可以找到他的原型,原型還有原型, 那麼如此下去,就構成一個對象的序列,稱該結構為原型鏈

那麼,問題來了:

  1. 原型鏈到底什麼時候是一個頭
  2. 一個預設的原型鏈結構是怎樣的
  3. 原型鏈結構對一直語法的修正

2.1. 原型鏈的結構

凡是使用構造函數創建出來的對象,並且沒有利用賦值的方式修改原型,就說該對象保留預設的原型鏈

預設的原型鏈結構是什麼樣子呢?

例子:

    function Person() {}
    var p = new Person();
    // p 具有預設的原型鏈

預設的原型鏈結構是: 當前對象 -> 構造函數.prototype -> Object.prototype ->null

在實現繼承的時候,有時候會利用替換原型鏈結構的方式實現原型繼承,那麼原型鏈結構就會發生改變

    function ItcastCollection () {}
    ItcastCollection.prototype = [];
    var arr = new ItcastCollection();
    // arr -> [] -> Array.prototype -> Object.prototype -> null
    // var arr = new Array();

2.2. 什麼是原型式繼承

所謂的原型式繼承就是利用修改原型鏈的結構(增加一個節點,刪除一個節點,修改節點中的成員), 來使得實例對象可以使用整條鏈中的所有成員

這裡的使用規則必須滿足屬性搜索原則(昨天有提到)

2.3. 繪製原型鏈的結構

舉例:

  1. 繪製 {} 的原型鏈結構
  2. 繪製 [] 的原型鏈結構
  3.  

在JS中,所有的對象字面在解析以後,就是一個具體的對象了,那麼可以理解為調用的對象的構造方法

  1. 例如在代碼中寫上 {}, 就相當於 new Object()
  2. 例如代碼中有 [], 就相當於 new Array()
  3. 例如代碼中有 /./, 就相當於 new RegExp( '.' )

3. 函數的構造函數 Funtion

在JS中使用的Funtion 可以實例化函數對象,也就是說在JS中函數與普通對象一樣,也是一個對象類型。

  1. 函數是對象, 就可以使用對象的動態特性
  2. 函數是對象, 就有構造函數創建函數
  3. 函數是函數, 可以創建其他對象
  4. 函數是唯一可以限定變數作用域的結構

3.1. 函數Function 的實例

語法:

    new Function( arg0, arg1, arg2, ..., argN, body );
  1. Function中參數全部是字元串
  2. 該構造函數的作用是將 參數連接起來組成函數
    • 如果參數只有一個,那麼就表示函數體
    • 如果參數有多個,那麼最後一個參數表示新函數體,前面的所有參數表示新函數的參數
    • 如果沒有參數,表示創建一個空函數

例子1:創建一個列印一句話的函數

    // 傳統的
    function foo () {
        console.log( '你好' );
    }
    // Function
    var func = new Function( 'console.log( "你好" );' );
    // 功能上, 這裡 foo 與 func 等價

例子2:利用 Function 創建一個函數, 要求允許函數調用時傳入任意個數參數, 並且函數返回這些數字中最大的數字.

    function foo ( ) {
        // 所有的參數都在 arguments 中. 將其當做數組使用
        // 問題而已轉換成在有一個數組中求最大值
        var args = arguments;
        var max = args[ 0 ];
        for ( var i = 1; i < args.length; i++ ) {
            if ( max < args[ i ] ) {
                max = args[ i ];
            }
        }
        return max;
    }

3.1.1. arguments 對象

arguments 是一個偽數組對象. 它表示在函數調用的過程中傳入的所有參數的集合. 在函數調用過程中沒有規定參數的個數與類型, 因此函數調用就具有靈活的特性, 那麼為了方便使用, 在 每一個函數調用的過程中, 函數代碼體內有一個預設的對象 arguments, 它存儲著實際傳入的所有參數.

4. 對象的原型鏈結構

任意一個函數,都是相當於 Function 的實例,類似於{}和new Object()的關係

    function foo () {}
    // 告訴解釋器, 有一個對象叫 foo, 它是一個函數
    // 相當於 new Function() 得到一個 函數對象
  1. 函數應該有什麼屬性? __proto__
  2. 函數的構造函數是什麼? Function
  3. 函數應該繼承自 Function.prototype
  4. Fucntion.prototype 繼承自 Object.protoype

4.1. 繪製函數的三角形結構

  1. Object 函數是 Function 的一個實例
  2. Object 作為對象是繼承自 Function.prototype 的, 又 "Function.prototype" 繼承自 Object.prototype
  3. Function 是自己的構造函數( * )

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

-Advertisement-
Play Games
更多相關文章
  • 本文為原創文章,轉載請註明出處,謝謝 Master 選舉 1、原理 伺服器爭搶創建標誌為Master的臨時節點 伺服器監聽標誌為Master的臨時節點,當監測到節點刪除事件後展開新的一輪爭搶 某個伺服器成功創建則為Master 2、架構圖 Master:伺服器爭搶節點 Servers:伺服器列表節點 ...
  • vi 顯示行號 :set num 在開始玩nginx之前,得先安裝nginx,可以參考 《ubuntu15.10_x64 安裝 nginx》 啟動 sudo /usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf 停止 ps –... ...
  • 參考: http://www.cnblogs.com/wuyuegb2312/archive/2013/03/28/2986963.html 中文亂碼在客戶端xshell解決:http://jingyan.baidu.com/article/3ea51489eca4b452e61bbaca.html... ...
  • 瀏覽器到 http://nginx.org/en/download.html 下載 stable version的nginx 如nginx-1.10.1.tar.gz,這是一個nginx源碼包,需要經過編譯和安裝才能使用。 解壓命令: tar –zxvf nginx-1.10.1.tar.gz cd... ...
  • 1. 實現思路 首先在實現這個效果之前 先來描述一下這個效果 A) 返回頂部的按鈕 一般會在屏幕的第二屏才會出現。 所以我們需要來判斷是否到達第二屏。 B) 其次 滑鼠移動上去會顯示返回頂部的字樣 C) 點擊 返回按鈕之後 會以慢慢返回上面 不會勻速 2. HTML 和 CSS 首先 div 表示中 ...
  • 問題 什麼是構造函數?構造函數與普通函數區別是什麼?用new關鍵字的時候到底做了什麼?構造函數有返回值怎麼辦?構造函數能當普通函數調用嗎? thisthis永遠指向當前正在被執行的函數或方法的owner。例如: 1 2 3 4 5 function test(){ console.log(this) ...
  • (1)子頁面調用父頁面的方法或者變數: window.parent.方法()或者變數名window.parent相當於定位到父頁面 之後的操作和在父頁面中寫代碼一樣寫 (2)父頁面調取子頁面 主要是通過contentWindow定位到子頁面 ...
  • 自己遇到的使用window.open打開新視窗被攔截的幾種情況(使用的chrome瀏覽器,其他瀏覽器未測): 第一次:window.open("www.baidu.com"),打開了新視窗,但是頁面並沒有載入出來,需要回車才能出來 解決方法:頁面地址需要加上協議名稱http://或者https:// ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...