摘要:前言原型這個概念在這門語言中是一個核心關(guān)鍵的知識點,但是你是否真的已經(jīng)完全理解透徹了呢可能我個人的理解能力較差,因此經(jīng)過多次翻閱書籍和實踐我才真正了解原型,所以記錄下來以加深理解,也以便日后深入探討。
前言
原型涉及到的概念原型這個概念在JavaScript這門語言中是一個核心關(guān)鍵的知識點,但是你是否真的已經(jīng)完全理解透徹了呢?可能我個人的理解能力較差,因此經(jīng)過多次翻閱書籍和實踐我才真正了解原型,所以記錄下來以加深理解,也以便日后深入探討。如有不正確的地方,歡迎斧正!
區(qū)分原型指針和原型屬性__proto__/[[prototype]]
prototype
constructor
注:首先要區(qū)分的是原型指針__proto__/[[prototype]]和原型屬性prototype,很多時候我們可能會把它們混為一談,但是兩者實際上不是同一種東西!!!
原型指針__proto__/[[prototype]]
先來看一個例子:
var obj = {}; function fn() {}; console.log(obj.__proto__ === Object.prototype); // true console.log(obj.__proto__ === Object.getPrototypeOf(obj)); // true console.log(fn.__proto__ === Function.prototype); // true console.log(fn.__proto__ === Object.getPrototypeOf(Function)); // true
實際上,實例對象的原型指針[[prototype]]在某些宿主環(huán)境下是不能讀取到的;
但也有例外:
(1) 在瀏覽器環(huán)境下原型指針可以使用__proto__屬性讀取到
(2) ECMAScript 5版本增加的新方法Object.getPrototypeOf()可以進行讀取到
解釋:
每個對象在創(chuàng)建的時候都會有個原型指針的屬性指向負責構(gòu)造該對象的原型對象,以上面為例 ->
obj是由原型對象Object.prototype構(gòu)造的,等同于使用new Object構(gòu)造
fn是由原型對象Function.prototype構(gòu)造的,等同于使用new Function構(gòu)造
經(jīng)典的原型鏈圖示
?
謹記,往原型鏈向上追溯,最終都是由原型對象Object.prototype進行構(gòu)造!
原型屬性prototype
再來個栗子:
var obj = {}; function fn() {}; console.log(obj.prototype); // undefined console.log(fn.prototype === Object.prototype); // false console.log(fn.prototype === new fn().__proto__); // true console.log(fn.prototype === Object.getPrototypeOf(new fn)); // true
解釋:
以前我一直混淆的概念就在這里,
為什么obj.prototype是undefined呢?
為什么fn.prototype指向的不是Object.prototype?
如果你跟我一樣有這樣的疑惑的話,說明你理解錯了原型指針__proto__/[[prototype]]和原型屬性prototype的概念!!!
/** * 1. 如果你想得到構(gòu)造某對象的原型對象,你應(yīng)該讀取該對象的原型指針 * 2. 然而,讀取某對象的原型屬性prototype時,你的意圖應(yīng)該是想以該對象作為原型對象進行構(gòu)造實際對象 / // 這就解析了為什么,實例對象new fn的原型指針__proto__指向了fn.prototype(fn的原型屬性) // 另外,因為obj是普通對象,不可以使用new關(guān)鍵字進行構(gòu)造實例,因此自然也就沒有原型屬性了 -> undefined
如果還有疑惑,建議結(jié)合上面經(jīng)典的原型鏈圖示進行思考!
構(gòu)造器指針constructor
老規(guī)矩,上代碼
var obj = {}; function fn() {}; console.log(obj.constructor === Object); // true console.log(fn.constructor === Function); // true console.log(obj.hasOwnProperty("construnctor")); // false console.log(fn.hasOwnProperty("construnctor")); // false
通過以上代碼,我們可以知道,其實obj和fn對象自身并沒有constructor這個屬性,實際上constructor是構(gòu)造他們的原型對象上面的屬性,并且指向構(gòu)造對象本身!(once again,如果還有疑惑請建議結(jié)合上面經(jīng)典的原型鏈圖示進行思考!)
參考文獻javascript高級程序設(shè)計(第三版)——[美]Nichilas C.Zakas 著
javascript權(quán)威指南(第6版)——David Flangan 著 淘寶前端團隊 譯
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/89079.html
摘要:引子獨家解析原型繼承已經(jīng)比較全面的分析了自定義函數(shù)類型,內(nèi)置基本類和內(nèi)置對象類型的的以及的原型鏈。鑒于函數(shù)是的一等公民,另辟新篇介紹函數(shù)的原型及其應(yīng)用。函數(shù)本身也是對象,它遵循獨家解析原型繼承所描述的自定義函數(shù)類型對象的原型法則。 引子 獨家解析Javascript原型繼承已經(jīng)比較全面的分析了自定義函數(shù)類型,JS內(nèi)置基本類(undefined, null, bool, number, ...
摘要:每一個由構(gòu)造函數(shù)創(chuàng)建的對象都會默認的連接到該神秘對象上。在構(gòu)造方法中也具有類似的功能,因此也稱其為類實例與對象實例一般是指某一個構(gòu)造函數(shù)創(chuàng)建出來的對象,我們稱為構(gòu)造函數(shù)的實例實例就是對象。表示該原型是與什么構(gòu)造函數(shù)聯(lián)系起來的。 本文您將看到以下內(nèi)容: 傳統(tǒng)構(gòu)造函數(shù)的問題 一些相關(guān)概念 認識原型 構(gòu)造、原型、實例三角結(jié)構(gòu)圖 對象的原型鏈 函數(shù)的構(gòu)造函數(shù)Function 一句話說明什么...
摘要:如下代碼輸出的結(jié)果是代碼執(zhí)行分為兩個大步預(yù)解析的過程代碼的執(zhí)行過程預(yù)解析與變量聲明提升程序在執(zhí)行過程中,會先將代碼讀取到內(nèi)存中檢查,會將所有的聲明在此進行標記,所謂的標記就是讓解析器知道有這個名字,后面在使用名字的時候不會出現(xiàn)未定義的錯誤。 showImg(https://segmentfault.com/img/remote/1460000012922850); 如下代碼輸出的結(jié)果是...
原型鏈之前一直都不是很理解,這兩天把《你不知道的JavaScript》和《JavaScript高級程序設(shè)計》的原型鏈那章看完后有所理解,在這里先記下來,加深印象。 什么是原型對象 要講清楚什么是原型鏈需要從原型對象開始談,那么什么是原型對象呢?《JavaScript高級程序設(shè)計》中是這樣講的: 無論什么時候,只要創(chuàng)建了一個新函數(shù),就會根據(jù)一組特定的規(guī)則為該函數(shù)創(chuàng)建一個prototype屬性,這個屬...
1. JS基本的數(shù)據(jù)類型和引用類型 基本數(shù)據(jù)類型:number、string、null、undefined、boolean、symbol -- 棧 引用數(shù)據(jù)類型:object、array、function -- 堆 兩種數(shù)據(jù)類型存儲位置不同 原始數(shù)據(jù)類型是直接存儲在棧(stack)中的簡單數(shù)據(jù)段,占據(jù)空間小、大小固定,屬于被頻繁使用數(shù)據(jù); 引用數(shù)據(jù)類型存儲在堆(heap)中的對象,占據(jù)空間大、大...
閱讀 3769·2021-09-02 09:53
閱讀 2749·2021-07-30 14:57
閱讀 3492·2019-08-30 13:09
閱讀 1179·2019-08-29 13:25
閱讀 810·2019-08-29 12:28
閱讀 1453·2019-08-29 12:26
閱讀 1129·2019-08-28 17:58
閱讀 3305·2019-08-26 13:28