摘要:有一個有趣的現(xiàn)象為何為等等這些都被稱作是構(gòu)造函數(shù)想一下我們可以來創(chuàng)建一個對象,所以本身就是一個構(gòu)造函數(shù),他們都是函數(shù)。而所有的函數(shù)都是構(gòu)造函數(shù)的實例。
一、原型(prototype)
定義:一個簡單的對象,用于實現(xiàn)對象的屬性繼承??梢院唵卫斫獬蓪ο蟮牡?。在Firefox和Chorme中,每個JS對象中都包含一個__proto__(非標(biāo)準(zhǔn))的屬性指向該對象的原型,可obj.__proto__進(jìn)行訪問
實例是通過構(gòu)造函數(shù)(new)創(chuàng)建出來的對象,實例通過__proto__指向原型,通過constructor指向構(gòu)造函數(shù)
以上描述可表示為:var a = new Object(); a.__proto__ === a.contructor.prototype
二、原型鏈(prototype chain)原型鏈?zhǔn)怯稍蛯ο蠼M成,每個對象都有一個__proto__屬性,指向了創(chuàng)建該對象的構(gòu)造函數(shù)的原型,__proto__將對象鏈接起來組成了原型鏈。是一個用來實現(xiàn)繼承和共享屬性的有限的對象鏈。
在 javaScript 中,每個對象都有一個指向它的原型(prototype)對象的內(nèi)部鏈接。這個原型對象又有自己的原型,直到某個對象的原型為 null 為止(也就是不再有原型指向),組成這條鏈的最后一環(huán)。這種一級一級的鏈結(jié)構(gòu)就稱為原型鏈(prototype chain)
function A(){}; var a = new A(); // a ===> a.__proto__(A.prototype) ===> A.prototype.__proto__(Object.prototype) ===> Object.prototype.__proto__ ===> null三、instanceof函數(shù)
定義:instanceof運算時會遞歸查找L的原型鏈,即L.__proto__.__proto__.__proto__.__proto__...直到找到了或者找到頂層為止。一句話理解instanceof的運算規(guī)則為:instanceof檢測左側(cè)的__proto__原型鏈上,是否存在右側(cè)的prototype原型。
有一個有趣的現(xiàn)象:
Function instanceof Object; // true Object instanceof Function; // true
為何Object instanceof Function為true?
Object, Function, Array等等這些都被稱作是構(gòu)造“函數(shù)”(想一下我們可以var a = new Object()來創(chuàng)建一個對象,所以Object本身就是一個構(gòu)造函數(shù)),他們都是函數(shù)。而所有的函數(shù)都是構(gòu)造函數(shù)Function的實例。
從原型鏈機(jī)制的的角度來說,即Function.prototype在Object的原型鏈上。Function這個內(nèi)置函數(shù)的Function.prototype是一個函數(shù)a,因為函數(shù)同時也是對象,因此這個函數(shù)a也定義了apply、call、bind等屬性(或者說方法)。而Object的委托目標(biāo)Object.__proto__正是這個函數(shù)a,代碼表示為:Function.prototype === Object.__proto__ // true
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/102267.html
摘要:每一個對象直接量都是的子類,即構(gòu)造函數(shù)中的構(gòu)造函數(shù)與普通函數(shù)并沒有什么兩樣,只不過在調(diào)用時,前面加上了關(guān)鍵字,就當(dāng)成是構(gòu)造函數(shù)了。由于沒有傳入變量,在調(diào)用的構(gòu)造函數(shù)時,會出錯這個問題可以通過一個空對象來解決改自。 showImg(https://segmentfault.com/img/bVmNZj); 對于 OO 語言,有一句話叫Everything is object,雖然 Ja...
摘要:在創(chuàng)建子類實例時,不能向超類型的構(gòu)造函數(shù)中傳遞參數(shù)。構(gòu)造函數(shù)繼承子類傳進(jìn)的值是基本思想是在子類構(gòu)造函數(shù)的內(nèi)部調(diào)用超類或父類型構(gòu)造函數(shù)。繼承保證構(gòu)造函數(shù)指針指向如果想同時繼承多個,還可使用添加屬性的方式類繼承, OOP:Object Oriented Programming 面向?qū)ο缶幊獭?題外話:面向?qū)ο蟮姆秶鷮嵲谔螅劝堰@些大的東西理解理解。 1.什么是對象? 根據(jù)高程和權(quán)威指南上...
摘要:不理解沒關(guān)系,下面會結(jié)合圖例分析上一篇高級程序設(shè)計筆記創(chuàng)建對象下一篇高級程序設(shè)計筆記繼承參考之原型鏈的解讀三張圖搞懂的原型對象與原型鏈繼承與原型鏈 文章直接從原型圖解開始的,如果對一些概念不太清除,可以結(jié)合后面幾節(jié)查看 1. 圖解原型鏈 1.1 鐵三角關(guān)系(重點) function Person() {}; var p = new Person(); showImg(https://s...
摘要:使用的構(gòu)造函數(shù)是,它只為新對象定義了默認(rèn)的屬性和方法。如果網(wǎng)頁中包含多個框架,那實際上就存在多個不同的全局執(zhí)行環(huán)境,從而存在多個不同版本的構(gòu)造函數(shù)。每個類在內(nèi)部都有一個屬性,這個屬性中就指定了上述字符串中的構(gòu)造函數(shù)。 js中常見的用于類型判斷的操作符或?qū)傩杂校簍ypeof、instanceof、prototype。下面我們就來看看他們是如何判斷數(shù)據(jù)類型的。 一.js數(shù)據(jù)類型 ECMAs...
摘要:中經(jīng)常使用構(gòu)造函數(shù)創(chuàng)建對象通過操作符調(diào)用一個函數(shù),那在使用調(diào)用一個函數(shù)的時候到底發(fā)生了什么先看幾個例子,再解釋背后發(fā)生了什么。其中就是指構(gòu)造函數(shù)本身。 JavaScript 中經(jīng)常使用構(gòu)造函數(shù)創(chuàng)建對象(通過 new 操作符調(diào)用一個函數(shù)),那在使用 new 調(diào)用一個函數(shù)的時候到底發(fā)生了什么?先看幾個例子,再解釋背后發(fā)生了什么。 1)看三個例子 1.1 無 return 語句 構(gòu)造函數(shù)最后...
閱讀 1478·2021-10-18 13:29
閱讀 2725·2021-10-12 10:18
閱讀 3593·2021-09-22 15:06
閱讀 2607·2019-08-29 17:09
閱讀 2798·2019-08-29 16:41
閱讀 1502·2019-08-29 13:48
閱讀 3237·2019-08-26 13:49
閱讀 3333·2019-08-26 13:34