JS高級. 03 混入式繼承/原型繼承/經典繼承、拓展內置對象、原型鏈、創建函數的方式、arguments、eval、靜態成員、實例成員

来源:http://www.cnblogs.com/mingm/archive/2017/10/18/7689693.html
-Advertisement-
Play Games

繼承:當前對象沒有的屬性和方法,別人有,拿來給自己用,就是繼承 1 混入式繼承 2.原型繼承 a) 給原型對象添加新成員(通過對象的動態特性),不是嚴格意義上的繼承 ,,,,實例對象繼承了原型 b) 直接替換原型對象 c) 利用混入的方式給原型對象添加成員 3.經典繼承 js var 對象1 = O ...


繼承:當前對象沒有的屬性和方法,別人有,拿來給自己用,就是繼承

 

1 混入式繼承

var I={ };
    var obj = {
                name: 'jack',
                age:18,
                sayGoodbye : function () {
                                        console.log("goodbye") ;
                }
    }
// 混入式繼承, a中 將繼承obj的所有屬性
    for (var k in obj ) {
        a[k] = obj [k] ;
    }

2.原型繼承

  1. 利用原型中的成員可以被其相關對象共用這一特性,可以實現繼承
  2. 實現步驟

    a)  給原型對象添加新成員(通過對象的動態特性),不是嚴格意義上的繼承 ,,,,實例對象繼承了原型

    b)  直接替換原型對象

    1. 構造函數.prototypr = 新對象
    2. 實例對象繼承了原型(新對象)
    3. 如果對象原本有屬性和方法,使用替換的方法會覆蓋原有的屬性和方法

    c)  利用混入的方式給原型對象添加成員

    1. 混入,遍歷一個對象的屬性和方法,賦值給另一個對象 for...in...

 

3.經典繼承

 js

  var 對象1 = Object.creat(對象2) ;

  這時候,創建出來的對象1 繼承自對象2

Object.creat方法存在相容性問題

  解決:      

    1.檢測瀏覽器是否支持Object.create方法,如果不支持,直接手動給Object添加create方法
    2.自定義函數,在函數內部判斷瀏覽器是否支持Object.create方法,如果不支持,則手動創建對象返回,否則直接調用

 

function creat(obj) {
    if (object.creat){
            return Object.creat(obj);
       }else{
            function F(){
                }
            F.prototype = obj;
            return new F();
            }
    }

如何更安全的拓展內置對象

function MyArray() {
    this.name = "我是數組"     
}

var arr = new Array();
MyArray.prototype =arr ; // 繼承後,我的數組中 就有了原生數組對象的所有屬性和方法
var  myArr = new MyArray() ;   // myArr 這個對象就繼承自arr 
  

 

原型鏈

什麼是原型鏈
每個構造函數都有原型對象,每個對象都有構造函數,每個構造函數的原型對象都是對象,也就有構造函數
然後就形成一個鏈式的結構,我們稱之為原型鏈

 原型繼承是什麼?
通過修改原型鏈的結構,實現繼承的方式就是原型繼承

屬性搜索原則

  1. 當訪問一個對象的成員的時候,先在自身找有沒有,如果有,直接使用
  2. 如果沒有找到,則去當前對象的原型對象中去找,如果有,直接使用
  3. 如果沒有找到,則去原型對象的原型對象中去找,如果有,直接使用
  4. 指導Object,如果還是沒有,則返回null

通過修改原型鏈繼承結構實現的繼承就叫原型繼承

 

 

function Person() { } ;
var p = new Person() ;

p對象包含的對象有: Person.prototype中的成員 和自身擁有的成員

Person.prototype中的成員有 : Object.prototype的成員和自身的成員

   Object.prototype的成員:

    constructor : 指向和該原型相關的構造函數

    hasOwnProperty 方法: 判斷獨享本身是否擁有某個屬性.      obj.hasOwnProperty("屬性名")

    isPrototypeOf 方法 判斷一個對象是不是另一個對象的原型對象。    obj.isPrototypeOf(obj2) 

    propertyIsEnumerable 方法 : 1.判斷屬性是否屬於對象本身 && 2.判斷屬性是否可以遍歷 是的話才返回ture。反之 false。

    toString toLocaleString: 將對象轉換成字元串  toLocaleString轉換成字元串的時候應用的本地的設置模式

    valueOf  方法: 在對象參與運算的時候,首先調用valueOf方法獲取對象的值,若該值無法參與運算,將會調

            用toString方法

    __proto__ 屬性: 指向當前對象的原型對象

 

Function

 3種創建函數的方式:

  直接聲明

  函數表達式

  new Function()

可以用Function 來創建函數:

 語法:

  

var 函數名 = new Function ( ) ; // 創建一個空的函數
var 函數名 = new Function("函數體"); // 創建一個沒有參數的函數
var 函數名 = new Function("參數1","參數2","參數3",..."函數體" ) ;
 // 當給Function傳多個參數的時候,最後一個參數為函數體,前面的參數為創造出來的函數的形參。 Function 接收的所有的參數 都是字元串類型的

arguments 對象
arguments 對象是函數內部的一個對象,在函數調用的時候,系統會預設的將所有傳入的實參存入該對象 

註意: 不管有沒有形參, 實參都會被存入該對象

var distinct = new Function(`
  var arr = [];
  for (var i = 0; i < arguments.length; i++) {
    if(arr.indexOf(arguments[i])==-1){
    arr.push(arguments[i]);
    }
  }
  return arr;
`);

//可以使用Ese下邊的符號 來連接字元串進行換行操作 但是存在相容性問題

console.log(distinct(1, 2, 34, 34, 5, 5));   

 

instanceof  關鍵字
        //語法    對象 instanceof 構造函數
        //判斷該構造函數的原型是否存在於該對象的原型鏈上

        function Person(){
        }

        //p--->Person.prototype--->Object.prototype--->null
        var p = new Person();
        //構造函數的**原型**是否在該對象的原型鏈上!
        console.log(p instanceof Person);



//Object構造函數 是 通過 Function 構造函數 實例化出來的
//Function構造函數 也是 通過 Function 構造函數 實例化出來的(不要強行去理解)

//instanceof
//Object.prototype是否在Function的原型鏈上
//Function-->Function.prototype---->Object.prototype---->null
// console.log(Function instanceof Object); //true
//Function.prototype是否在Functionde原型鏈上
// console.log(Function instanceof Function);

//Object--->Function.prototype---->Object.prototype----->null
// console.log(Object instanceof Function);
// console.log(Object instanceof Object);

 

eval 可以將字元串 轉換成js代碼並執行

  註意:當使用eval解析JSON格式字元串的時候,要註意,會將{}解析為代碼段

1.可以在JSON格式字元串前面拼接 "var 變數名 ="
eval("var 變數名 =" + JSON格式的字元串);

2.可以在JSON格式字元串前後拼接()
eval("("+JSON格式的字元串+")")

靜態成員和實例成員
  靜態成員
  通過構造函數去訪問的屬性和方法就是靜態成員

  實例成員
  通過對象(實例)去訪問的屬性和方法就是實例成員

 


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

-Advertisement-
Play Games
更多相關文章
  • 比如,在瀏覽器地址欄輸入:ip地址路徑/abc.html. Step1.預設訪問的是一個servlet,會從web.xml中查找有沒有匹配的servlet. web.xml url-pattern 匹配規則: (1) 精確匹配: <url-pattern>/abc.html</url-pattern ...
  • 堆排序過程:(用到遞歸演算法) 主函數中: public void main(String[] args)1. 定義初始化數組:int[] a = new int[]{.............}2. 迴圈建堆 調用建堆函數: for (int i = 0; i < a.length - 1; i++ ...
  • 總結下經驗 1、下載花生殼客戶端並註冊賬號 2、登錄官網,可以在下圖看到分配的功能變數名稱 3、設置內網穿透,先點“添加映射”,按照提示填寫 功能變數名稱 : 功能變數名稱列表哪裡看到的 功能變數名稱 應用名稱 : web應用的名稱 內網主機 : 你的伺服器的ip 內網埠 : 你的web容器(如:tomcat)的埠 添加成功的 ...
  • 快速排序法:(用到遞歸演算法) 首先先定義一個數組,這裡定義一個int類型的數組。預定義數組第一個數為基準數Base,再定義兩個游標(索引),分別從數組的最左端和最右端向左和向右進行移動。 迴圈過程:第一次迴圈: 先由右向左移動右側的游標,找到比基準數小的數字就停止。再由左向右移動左側的游標,找到比基 ...
  • 博客里有很多大神寫過很多帖子,也都是五花八門什麼內容都有了。但是對於剛入手Java的人來說,有些帖子未必太深奧,很難去消化。所以這裡有個建議,那就是關註我,我們一起好好研究一下Java的源碼。Java的源碼研究投了,那就一通百通了,任你闖蕩Java的世界了。 Java源碼系列,看完所有的貼後,我希望 ...
  • 近段時間漸覺自己愚弱,感覺各方面都有些透支。索性去腦補一下設計模式。講真,之前對此也是一知半解,未曾有太多研究,此番也是做簡單瞭解,參考園裡大神做些紀要。於是乎,我又一次發覺其實在日常擼碼中已經隱隱約約用到了各種設計模式(你覺得夢想很遠,其實你已經在路上了)。比如,資料庫連接池用到了單例模式;比如, ...
  • 面向對象的基本特征 1.封裝性 封裝性就是把對象的屬性和服務結合成一個獨立的相同單位,並儘可能隱蔽對象的內部細節,包含兩個含義: ◇ 把對象的全部屬性和全部服務結合在一起,形成一個不可分割的獨立單位(即對象)。 ◇ 信息隱蔽,即儘可能隱蔽對象的內部細節,對外形成一個邊界〔或者說形成一道屏障〕,只保留 ...
  • 什麼是中介者模式? 在現實生活中,有很多中介者模式的身影,例如QQ游戲平臺,聊天室、QQ群、簡訊平臺和房產中介。不論是QQ游戲還是QQ群,它們都是充當一個中間平臺,QQ用戶可以登錄這個中間平臺與其他QQ用戶進行交流,如果沒有這些中間平臺,我們如果想與朋友進行聊天的話,可能就需要當面才可以了。電話、短 ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...