JS之原型相關

原型概述

  • 原型(prototype): 保存所有子對象共有成員的對象
  • 每個構造函數都有一個原型屬性, 引用了該構造函數對應的原型對象
  • 由構造函數創建的每個對象中都有一個proto屬性, 指向構造函數的原型對象
  • 在訪問子對象的成員時, 優先在成員本地查找, 找不到, 再去構造函數的原型中查找
  • new:
    1. 創建空對象
    2. 調用構造函數, 爲新對象添加成員
    3. 設置當前對象的proto屬性爲構造函數的原型對象
  • 原型鏈: 由各級對象的proto逐級向上引用形成的多級繼承關係
  • 自有屬性: 保存在對象本地的屬性
  • 共有屬性: 保存在公共原型對象中的屬性
  • 成員位置的選擇
    • 何時放在構造函數中: 每個對象自有的成員
    • 何時放在原型對象中: 所有子對象共有的成員
  • 重寫: override, 子對象覺得父對象的成員不好用, 可自己定義同名的自有成員覆蓋父對象的同名成員
  • 對象的克隆: 在Object的原型對象中添加clone方法
  • constructor屬性: 只有構造函數的原型對象纔有, 從構造函數的原型對象指回構造函數對象

原型相關API

  • 判斷對象的屬性是自有還是共有
    • 如何判斷一個屬性是否可用
      • in關鍵字: 屬性名 in 對象
        • 如果屬性名在當前對象的原型鏈中, 返回true; 如果在整條原型鏈上都沒找到, 返回false。
      • 使用===undefined: 說明不包含
        • 可簡寫爲(!對象.成員名)
    • 專門判斷是否自有屬性: obj.hasOwnProperty(“成員名”);
      • 如果obj本地有指定成員, 則返回true, 沒有返回false
    • 判斷共有屬性: 不是自有的, 還要存在於原型鏈上
      • (!obj.hasOwnProperty(“成員名”)&&”成員” in obj)
  • 獲得任意對象的proto屬性: 獲得父級對象
    • var 父對象 = Object.getPrototypeOf(對象);
  • 判斷父對象是否處在子對象的上級
    • 父對象.isPrototypeOf(子對象); //只要父對象在子對象的原型鏈上, 就返回true, 否則返回false
  • 刪除對象中的屬性: delete 對象.成員
    • 只能刪除自有的成員
    • 只有var聲明的全局變量不讓delete, 使用window.或window[“”]增加的全局成員可以delete

繼承

  • 面向對象三大特點: 封裝、繼承、多態
    • 封裝: 將相關的屬性和方法, 集中定義在一個對象中
    • 繼承: 父對象中定義的成員, 子對象可直接訪問, 不用定義
    • 多態: js僅變相支持重載
  • 繼承方式
    • 一個對象, 直接繼承另一個對象: Object.setPrototypeOf(子對象, 父對象), 相當於子對象.proto=父對象
    • 修改構造函數的原型對象, 統一修改之後創建的所有子對象的公共原型: 構造函數.prototype = 父對象
      • 注意: 必須在首次實例化對象之前
    • 僅繼承結構
      • 何時使用: 兩種類型間形成繼承關係, 不要求兩種類型的實例對象間有繼承
      • 如何繼承結構:
        1. 子類型構造函數開始位置, 先調用父類型構造函數
        2. 設置子類型的原型對象, 繼承父類型的原型對象
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章