目錄
2、繼承
 1)原型繼承
首頁 web前端 js教程 如何理解javascript原型鏈

如何理解javascript原型鏈

Jul 20, 2021 pm 03:12 PM
javascript

原型鏈其實就是有限的實例物件和原型之間組成有限鏈,就是用來實現共享屬性和繼承的。存在兩個主要的問題:1、它不方便給父級類型傳遞參數;2、父級類型當中的引用類型被所有的實例共享。

如何理解javascript原型鏈

本教學操作環境:windows7系統、javascript1.8.5版、Dell G3電腦。

new操作符具體做了什麼呢?其實很簡單,就乾了三件事情。

var obj  = {};
obj.__proto__ = Base.prototype;
Base.call(obj);
登入後複製

第一行,我們建立了一個空物件obj

第二行,我們將這個空物件的__proto__成員指向了Base函數物件prototype成員物件

第三行,我們將Base函數物件的this指標替換成obj,然後再呼叫Base函數,於是我們就給obj物件賦值了一個id成員變量,這個成員變數的值是」base”,關於call函數的用法。

在談原型鏈之前,我們首先要了解自訂函數與 Function 之間是什麼關係,而建構子、原型和實例之間又有什麼千絲萬縷的關係呢?其實,所有的函數都是 Function 的實例。在建構子上都有一個原型屬性prototype,該屬性也是一個物件;那麼在原型物件上有一個constructor 屬性,該屬性指向的就是建構子;而實例物件上有一個_proto_  屬性,該屬性也指向原型對象,且該屬性不是標準屬性,不可以用在程式設計中,該屬性用於瀏覽器內部使用。

// _proto_
在函数里有一个属性prototype
由该函数创建的对象默认会连接到该属性上
    //prototype 与 _proto_ 的关系
_proto_是站在对象角度来说的
prototype 是站在构造函数角度来说的
登入後複製

  下面,我們來看圖說話。

1、構造函數、原型和實例之間的關係

        ① Object

    ② Function Object Array

  了解這些之後,我們再來討論什麼是原型鏈。說穿了,其實就是有限的實例物件和原型之間組成有限鏈,就是用來實現共享屬性和繼承的。下面,我們看程式碼說話。

 var obj = new Object();
对象是有原型对象的
原型对象也有原型对象
   obj._proto_._proto_._proto_
原型对象也有原型对象,对象的原型对象一直往上找,会找到一个null
// 原型链示例
   var arr = [];
   arr -> Array.prototype ->Object.prototype -> null
   var o = new Object();
   o -> Object.prototype -> null;
登入後複製
function Foo1(){
   this.name1 = '1';
}
function Foo2(){
   this.name2 = '2';
}
Foo2.prototype = new Foo1();
function Foo3(){
   this.name = '3';
}
Foo3.prototype = new Foo2();
var foo3 = new Foo3();
console.dir(foo3);
登入後複製

  接下來就是繼承問題了。

2、繼承

 1)原型繼承

function Animal(name){
       this.name = name;
   }
   function Tiger(color){
       this.color = color;
   }
//   var tiger = new Tiger('yellow');
//   console.log(tiger.color);
//   console.log(tiger.name);  //undefined
//      Tiger.prototype = new Animal('老虎');   //一种方式
   Object.prototype.name = '大老虎';   //第二种方式
        var tiger = new Tiger('yellow');
        console.log(tiger.color);
        console.log(tiger.name);
登入後複製

  值得注意的是,這裡有兩個主要的問題: ①它不方便地傳遞參數給父級類型; ②父級類型當中的參考類型被所有的實例共享

    2)ES5 提供了Object.create() 方法來實現繼承

————做兼容
  //shim垫片
    function create(obj){
        if(Object.create){
            return Object.create(obj);
        }else{
            function Foo(){}
            Foo.prototype = obj;
            return new Foo();
        }
    }
登入後複製

  這個方法是ES5的新特性,其實就是複製繼承。

    3)拷貝繼承

var obj = {};
obj.extend = function(obj){
    for(var k in obj){
      this[k] = obj[k];
    }
}
登入後複製

     4)借用建構函式繼承

-被借用的建構函式中原型上的成員沒有被借過來

function Animal(name){
    this.name = name;
}
function Mouse(nickname){
    Animal.call(this,'老鼠');
    this.nickname = nickname;
}
var m = new Mouse('杰瑞');
console.log(m.name);
console.log(m.nickname);
登入後複製

   存在的問題:可以解決原型繼承當中傳參問題,但是父親類型當中的原型物件上的成員(屬性和方法)不能被繼承到

    5)組合繼承

——prototype物件是有動態性的

function Person(name){
   this.name = name;
}
Person.prototype.showName = function(){
   console.log(this.name);
}
function Student(name,age){
   Person.call(this,name);
   this.age = age;
}
Student.prototype = new Person();
Student.prototype.contructor = Student;
Student.prototype.showAge = function(){
    console.log(this.age);
}
var stu = new Student('张三',12);
stu.showName();
stu.showAge();
登入後複製

【原型繼承借用建構函式繼承】它的特點就是屬性每個實例一份,方法共享

【小結】套用一句很粗暴的話,所謂原型鏈就是找媽的一種行為方式,就可以理解為人是人他媽生的,妖是妖他媽生的。原型鏈的核心其實只有一個:屬性共享和獨立的控制,當你的物件實例需要獨立的屬性,所有做法的本質都是在物件實例裡面創造屬性。若不考慮太多,你大可以在Person裡面直接定義你所需要獨立的屬性來覆寫原型的屬性。總之,使用原型繼承的時候,要對於原型中的屬性要特別注意,因為他們都是牽一發而動全身的存在。現在最常用的方法是組合模式。

1、原型鏈

    1)建構子、原型與實例的關係式

        ①建構子都有一個屬性prototype,這個屬性是一個物件(ObjectObject的實例)

        ②原型物件prototype裡面有一個constructor屬性,該屬性指向原型物件所屬的建構子

        ③物件所屬的建構函式

        ③物件具有一個_proto_實例屬性,該屬性也指向建構子的實例物件原型對象,它是一個非標準屬性,不可以用於編程,它是用於瀏覽器自己使用的

    2)prototype與_proto_的關係

        ①prototype是構造函數的屬性

###        ②_proto_是實例物件的屬性###

                    -這兩者都指向同一個物件

    【總結】i)函數也是物件,物件不一定是函數;值對集合;鍵值對當中的值可以是任意資料類型的值

            iii)物件就是一個容器,而這個容器當中放的是(屬性與方法)

  搜尋

      ①在存取物件的某個成員的時候會先在物件中找出是否存在

      ②如果目前物件中沒有找到建構函式的原型物件中找出建構子的原型物件中沒有就可以尋找建構函數的原型物件中。 ##      ③如果原型物件中沒有找到就到原型物件的原型上找

      ④知道Object的原型物件的原型是null為止

2、Function

###########################111]12212212、Function##########################11 —所有函數都是Function的實例######    ①本地物件:獨立於宿主環境(瀏覽器)的物件-包括Object、Array、Date、RegExp、Function、Error、Number、String、Boolean## ####    ②內建物件-包括Math、Global(window,在js中是全域變數),使用的時候不需要new######    ③宿主物件-包括自訂物件、DOM、BOM# #####【推薦學習:###javascript高階教學###】####

以上是如何理解javascript原型鏈的詳細內容。更多資訊請關注PHP中文網其他相關文章!

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

如何使用WebSocket和JavaScript實現線上語音辨識系統 如何使用WebSocket和JavaScript實現線上語音辨識系統 Dec 17, 2023 pm 02:54 PM

如何使用WebSocket和JavaScript實現線上語音辨識系統引言:隨著科技的不斷發展,語音辨識技術已成為了人工智慧領域的重要組成部分。而基於WebSocket和JavaScript實現的線上語音辨識系統,具備了低延遲、即時性和跨平台的特點,成為了廣泛應用的解決方案。本文將介紹如何使用WebSocket和JavaScript來實現線上語音辨識系

WebSocket與JavaScript:實現即時監控系統的關鍵技術 WebSocket與JavaScript:實現即時監控系統的關鍵技術 Dec 17, 2023 pm 05:30 PM

WebSocket與JavaScript:實現即時監控系統的關鍵技術引言:隨著互聯網技術的快速發展,即時監控系統在各個領域中得到了廣泛的應用。而實現即時監控的關鍵技術之一就是WebSocket與JavaScript的結合使用。本文將介紹WebSocket與JavaScript在即時監控系統中的應用,並給出程式碼範例,詳細解釋其實作原理。一、WebSocket技

如何利用JavaScript和WebSocket實現即時線上點餐系統 如何利用JavaScript和WebSocket實現即時線上點餐系統 Dec 17, 2023 pm 12:09 PM

如何利用JavaScript和WebSocket實現即時線上點餐系統介紹:隨著網路的普及和技術的進步,越來越多的餐廳開始提供線上點餐服務。為了實現即時線上點餐系統,我們可以利用JavaScript和WebSocket技術。 WebSocket是一種基於TCP協定的全雙工通訊協議,可實現客戶端與伺服器的即時雙向通訊。在即時線上點餐系統中,當使用者選擇菜餚並下訂單

如何使用WebSocket和JavaScript實現線上預約系統 如何使用WebSocket和JavaScript實現線上預約系統 Dec 17, 2023 am 09:39 AM

如何使用WebSocket和JavaScript實現線上預約系統在當今數位化的時代,越來越多的業務和服務都需要提供線上預約功能。而實現一個高效、即時的線上預約系統是至關重要的。本文將介紹如何使用WebSocket和JavaScript來實作一個線上預約系統,並提供具體的程式碼範例。一、什麼是WebSocketWebSocket是一種在單一TCP連線上進行全雙工

JavaScript與WebSocket:打造高效率的即時天氣預報系統 JavaScript與WebSocket:打造高效率的即時天氣預報系統 Dec 17, 2023 pm 05:13 PM

JavaScript和WebSocket:打造高效的即時天氣預報系統引言:如今,天氣預報的準確性對於日常生活以及決策制定具有重要意義。隨著技術的發展,我們可以透過即時獲取天氣數據來提供更準確可靠的天氣預報。在本文中,我們將學習如何使用JavaScript和WebSocket技術,來建立一個高效的即時天氣預報系統。本文將透過具體的程式碼範例來展示實現的過程。 We

簡易JavaScript教學:取得HTTP狀態碼的方法 簡易JavaScript教學:取得HTTP狀態碼的方法 Jan 05, 2024 pm 06:08 PM

JavaScript教學:如何取得HTTP狀態碼,需要具體程式碼範例前言:在Web開發中,經常會涉及到與伺服器進行資料互動的場景。在與伺服器進行通訊時,我們經常需要取得傳回的HTTP狀態碼來判斷操作是否成功,並根據不同的狀態碼來進行對應的處理。本篇文章將教你如何使用JavaScript來取得HTTP狀態碼,並提供一些實用的程式碼範例。使用XMLHttpRequest

javascript如何使用insertBefore javascript如何使用insertBefore Nov 24, 2023 am 11:56 AM

用法:在JavaScript中,insertBefore()方法用於在DOM樹中插入一個新的節點。這個方法需要兩個參數:要插入的新節點和參考節點(即新節點將要插入的位置的節點)。

如何在JavaScript中取得HTTP狀態碼的簡單方法 如何在JavaScript中取得HTTP狀態碼的簡單方法 Jan 05, 2024 pm 01:37 PM

JavaScript中的HTTP狀態碼取得方法簡介:在進行前端開發中,我們常常需要處理與後端介面的交互,而HTTP狀態碼就是其中非常重要的一部分。了解並取得HTTP狀態碼有助於我們更好地處理介面傳回的資料。本文將介紹使用JavaScript取得HTTP狀態碼的方法,並提供具體程式碼範例。一、什麼是HTTP狀態碼HTTP狀態碼是指當瀏覽器向伺服器發起請求時,服務

See all articles