<span id="mktg5"></span>

<i id="mktg5"><meter id="mktg5"></meter></i>

        <label id="mktg5"><meter id="mktg5"></meter></label>
        最新文章專題視頻專題問答1問答10問答100問答1000問答2000關鍵字專題1關鍵字專題50關鍵字專題500關鍵字專題1500TAG最新視頻文章推薦1 推薦3 推薦5 推薦7 推薦9 推薦11 推薦13 推薦15 推薦17 推薦19 推薦21 推薦23 推薦25 推薦27 推薦29 推薦31 推薦33 推薦35 推薦37視頻文章20視頻文章30視頻文章40視頻文章50視頻文章60 視頻文章70視頻文章80視頻文章90視頻文章100視頻文章120視頻文章140 視頻2關鍵字專題關鍵字專題tag2tag3文章專題文章專題2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章專題3
        問答文章1 問答文章501 問答文章1001 問答文章1501 問答文章2001 問答文章2501 問答文章3001 問答文章3501 問答文章4001 問答文章4501 問答文章5001 問答文章5501 問答文章6001 問答文章6501 問答文章7001 問答文章7501 問答文章8001 問答文章8501 問答文章9001 問答文章9501
        當前位置: 首頁 - 科技 - 知識百科 - 正文

        JavaScript中的原型prototype完全解析_基礎知識

        來源:懂視網 責編:小采 時間:2020-11-27 21:50:17
        文檔

        JavaScript中的原型prototype完全解析_基礎知識

        JavaScript中的原型prototype完全解析_基礎知識:要理解JS中的prototype, 首先必須弄清楚以下幾個概念 1. JS中所有的東西都是對象 2. JS中所有的東西都由Object衍生而來, 即所有東西原型鏈的終點指向Object.prototype // [constructor, toString, toLocaleString
        推薦度:
        導讀JavaScript中的原型prototype完全解析_基礎知識:要理解JS中的prototype, 首先必須弄清楚以下幾個概念 1. JS中所有的東西都是對象 2. JS中所有的東西都由Object衍生而來, 即所有東西原型鏈的終點指向Object.prototype // [constructor, toString, toLocaleString
        要理解JS中的prototype, 首先必須弄清楚以下幾個概念
        1. JS中所有的東西都是對象

        2. JS中所有的東西都由Object衍生而來, 即所有東西原型鏈的終點指向Object.prototype

        3. JS中構造函數和實例(對象)之間的微妙關系
        構造函數通過定義prototype來約定其實例的規格, 再通過 new 來構造出實例, 他們的作用就是生產對象.
        而構造函數(方法)本身又是方法(Function)的實例, 因此也可以查到它的__proto__(原型鏈)

        Object / function F() {} 這樣子的就是構造函數啦, 一個是JS原生API提供的, 一個是自定義的
        new Object() / new F() 這樣子的就是實例啦
        實例就"只能"查看__proto__來得知自己是基于什么prototype被制造出來的,
        而"不能"再重新定義實例的prototype妄想創造出實例的實例了.

        實踐出真知, 只有自己動手觀察/思考才能真正領悟:

        你可能已經暈了, 我們來分解一下。

        prototype
        prototype輸出的格式為: 構造函數名 原型
        首先看下Object.prototype輸出了什么?
        Object {} -> 前面的Object為構造函數的名稱, 后面的那個表示原型, 這里是一個{}, 即一個Object對象的實例(空對象)
        那么 F {} 我們就明白是什么意思了, F 就是構造函數的名稱, 原型也是一個空對象

        我們再深入一點, 定義下 F 的原型看看到底會發生些什么?

        這樣我們就清楚的看到 i 是由 F 構造出來的, 原型是 {a: function}, 就是原本的空對象原型新增了一個 a 方法

        我們再換一種情況, 完全覆蓋 F 的原型會怎么樣?

        咦~ 為什么這里表明 i 是由 Object 構造出來的? 不對吧!
        因為我們完全將 F 的prototype覆蓋, 其實也就是將原型指定為對象{a: function}, 但這會造成原本的constructor信息丟失, 變成了對象{a: function}指定的constructor.
        那么對象{a: function}的constructor是什么呢?
        因為對象{a: function}其實就相對于

        那么o的constructor當然是 Object 啦

        我們來糾正下這個錯誤

        現在又能得到正確的原型信息了~

        原型鏈

        然后來看看什么原型鏈又是個什么東西?
        簡單的來講和OOP中的繼承關系(鏈)是一樣的, 一層一層往上找, 直至最終的 Object.prototype

        2016510172352211.jpg (560×248)

        最最關鍵的是要弄清楚JS中哪些東西是(實例)對象, 這個簡單了, JS中所有東西都是對象!
        再要弄清楚就是任何一個對象都是有一個原型的!

        那么我們來證明一下:

        Prototype和__proto__
        每一個對象都包含一個__proto__,指向這個的對象的“原型”。
        類似的事情是,每一個函數都包含一個prototype,這個prototype對象干什么的了?

        咱們看看如下代碼,用構造函數來創建一個對象(上面是用字面量的形式創建對象)。

        試想想,這個foo對象的__proto__會指向什么?

        2016510172448163.png (163×68)

        一個包含constructor屬性的對象?看不太懂沒關系,把函數Foo的prototype屬性打印出來,對比一下就知道了。

        2016510172512274.png (183×69)

        原來,new出來的對象foo的__proto__就只指向函數Foo的prototype。

        JS這么設計有何意義了?回憶下上面說的,在JS的世界中,對象不是根據類(模具)創建出來的,而是從原型(另一個對象)衍生出來的。

        當我們執行new操作創建一個新的對象時,先不深入new操作的具體實現,但有一點我們是肯定的——就是為新對象的__proto__指向一個原型對象。

        就剛才這段代碼

        foo.__proto__到底要指向誰了?你怎么不能指向Foo這個函數本身吧,雖然函數也是對象,這個有機會會詳細講。但如何foo.__proto__指向Foo固然不合適,因為Foo是一個函數,有很多邏輯代碼,foo作為一個對象,繼承邏輯處理沒有任何意義,它要繼承的是“原型對象”的屬性。

        所以,每個函數會自動生成一個prototype對象,由這個函數new出來的對象的__proto__就指向這個函數的prototype。

        總結
        說了這么多,感覺還是沒完全說清楚,不如上一張圖。我曾經參考過其他網友的圖,但總覺得哪里沒說清楚,所以我自己畫了一張圖,如果覺得我的不錯,請點個贊!(老子可是費了牛勁才畫出來)。

        2016510172555695.png (800×600)

        咱們就著這張圖,記住如下幾個事實:

        1. 每個對象中都有一個_proto_屬性。

        JS世界中沒有類(模具)的概念,對象是從另一個對象(原型)衍生出來的,所以每個對象中會有一個_proto_屬性指向它的原型對象。(參考左上角的那個用字面量形式定義的對象obj,它在內存中開辟了一個空間存放對象自身的屬性,同時生成一個_proto_指向它的原型——頂層原型對象。)

        2. 每個函數都有一個prototype屬性。

        “構造函數”為何叫構造函數,因為它要構造對象。那么根據上面第一條事實,構造出來的新對象的_proto_屬性指向誰了?總不能指向構造函數自身,雖然它也是個對象,但你不希望新對象繼承函數的屬性與方法吧。所以,在每個構造函數都會有一個prototype屬性,指向一個對象作為這個構造函數構造出來的新對象的原型。

        3. 函數也是對象。

        每個函數都有一些通用的屬性和方法,比如apply()/call()等。但這些通用的方法是如何繼承的呢?函數又是怎么創建出來的呢?試想想,一切皆對象,包括函數也是對象,而且是通過構造函數構造出來的對象。那么根據上面第二條事實,每個函數也會有_proto_指向它的構造函數的prototype。而這個構造函數的函數就是Function,JS中的所有函數都是由Function構造出來的。函數的通用屬性與方法就存放在Function.prototype這個原型對象上。

        聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com

        文檔

        JavaScript中的原型prototype完全解析_基礎知識

        JavaScript中的原型prototype完全解析_基礎知識:要理解JS中的prototype, 首先必須弄清楚以下幾個概念 1. JS中所有的東西都是對象 2. JS中所有的東西都由Object衍生而來, 即所有東西原型鏈的終點指向Object.prototype // [constructor, toString, toLocaleString
        推薦度:
        標簽: pro js 解析
        • 熱門焦點

        最新推薦

        猜你喜歡

        熱門推薦

        專題
        Top
        主站蜘蛛池模板: 国产91在线|亚洲| 亚洲最大在线观看| 蜜芽亚洲av无码一区二区三区| 久久久久久精品免费免费自慰| 亚洲国产成人久久综合一| 成人性做爰aaa片免费看| 亚洲精品乱码久久久久久蜜桃不卡| 久久av免费天堂小草播放| 中文字幕在线亚洲精品| 特级毛片爽www免费版| 亚洲午夜无码AV毛片久久| 国产精品美女免费视频观看| 亚洲伊人久久精品影院| 免费国产在线视频| 亚洲精品不卡视频| 中文字幕影片免费在线观看| 日韩亚洲国产综合高清| 亚洲AⅤ无码一区二区三区在线| 春意影院午夜爽爽爽免费| 亚洲AV永久无码精品水牛影视| 99re视频精品全部免费| 亚洲制服丝袜第一页| 国产一卡二卡≡卡四卡免费乱码 | 国产精品福利片免费看| 国产成人无码综合亚洲日韩| 2019中文字幕在线电影免费| 亚洲中文字幕一二三四区| 免费一区二区三区四区五区| 两个人看的www高清免费观看| 亚洲国语在线视频手机在线| 成年女人永久免费观看片| 乱淫片免费影院观看| 亚洲va在线va天堂va四虎| 妞干网免费观看视频| 久久国产精品免费一区| 亚洲综合激情另类小说区| 四虎影视免费永久在线观看| 免费观看91视频| 亚洲精品第一国产综合亚AV| 亚洲精品国产字幕久久不卡| 18禁无遮挡无码网站免费|