成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

JS 原型的解釋

silvertheo / 3213人閱讀

首先明確兩個概念: 構(gòu)造函數(shù)和 instance 分別是什么

構(gòu)造函數(shù)
JS 中并沒有在語法層面上面區(qū)分構(gòu)造函數(shù)和普通函數(shù), 唯一的區(qū)別是調(diào)用方式
使用 new 調(diào)用的函數(shù)就是構(gòu)造函數(shù), 沒有則是普通函數(shù).

實(shí)例
new Constructor() 返回的對象稱為 Constructor 的一個實(shí)例

然后提出一個規(guī)則:
在構(gòu)造函數(shù)的原型上面附加的屬性或者方法, 可以被其所有的實(shí)例共用.

可以推導(dǎo)出:

構(gòu)造函數(shù)可以訪問到它的原型, 并且向其上面添加方法和屬性

構(gòu)造函數(shù)的原型應(yīng)該是一個對象, 這樣才能向其上添加方法和屬性

實(shí)例也擁有其構(gòu)造函數(shù)的原型的一個引用, 要不然無法共用.

解釋:
1 構(gòu)造函數(shù)的確有一個屬性, 可以訪問到它的原型, 屬性名為 prototype.
規(guī)范下稱呼:
a 函數(shù)的 prototype 屬性, 稱為 "原型屬性"
b 函數(shù)的 原型屬性指向的 對象, 稱為 "原型對象"

2 實(shí)例也的確擁有一個對其構(gòu)造函數(shù)的原型的引用
這個引用是一個內(nèi)部屬性, 使用 [[prototype]] 表示, 稱為 "實(shí)例的內(nèi)部屬性 prototype"
a 內(nèi)部屬性意味著這個玩意不可讀, 你沒有辦法訪問到的
b 部分瀏覽器為實(shí)例提供了一個屬性 "__proto__", 同樣指向 實(shí)例的構(gòu)造函數(shù)的原型對象.

從實(shí)例的角度來看:
1 實(shí)例希望知道自己的構(gòu)造函數(shù)是誰
2 實(shí)例希望知道自己可以使用的方法到底有多少, 希望知道它的構(gòu)造函數(shù)的原型里面到底有多少方法和屬性

實(shí)例何從知道自己的構(gòu)造函數(shù)是誰

 通過 constructor 屬性

每一個 instance, 可以通過 constructor 屬性, 訪問到它的構(gòu)造函數(shù)

 instance 并不擁有 constructor 屬性
      當(dāng)訪問 instance.constructor 的時(shí)候
           instance 本身不持有
           從它構(gòu)造函數(shù)的原型對象中查找
           發(fā)現(xiàn)存在 constructor 屬性
                返回 constructor 的值.

并且存在有:

 構(gòu)造函數(shù)原型對象的 constructor 屬性 始終指向構(gòu)造函數(shù)本身。
 fn.prototype.constructor === fn;

實(shí)例想要知道它的構(gòu)造函數(shù)的原型對象擁有多少方法和屬性

 
 根據(jù)上面的 constructor 屬性, 可以得到
 instance.constructor.prototype 即可訪問
 或者
 __proto__

應(yīng)用到具體的場景里面, JS 的所有數(shù)據(jù)類型的構(gòu)造函數(shù)是誰, 它們的構(gòu)造函數(shù)的原型對象是什么樣子的

原始值類型有:

String
Number
Null
Undefined
Boolean

構(gòu)造函數(shù)分別有:

(1).__proto__ // Number
"a".__proto__ // String
true.__proto__ // Boolean

引用值類型
Array
Function
Object

構(gòu)造函數(shù)分別有:
[].__proto__ // Array
{}.__proto__ // Object
(function (){}).__proto__ // Function

更近一步的思考:
構(gòu)造函數(shù)是否擁有構(gòu)造函數(shù)
構(gòu)造函數(shù)的原型對象是否擁有構(gòu)造函數(shù)

根據(jù)上面的信息, 可以嘗試一下

"a".constructor.constructor

最終發(fā)現(xiàn):
不論原始值類型, 還是引用類型, 它們的構(gòu)造函數(shù)的構(gòu)造函數(shù), 都是 Function
更近一步, Function 的構(gòu)造函數(shù)是誰
經(jīng)過驗(yàn)證, Function 的構(gòu)造函數(shù)是它本身.

 Function.constructor = Function;

說明構(gòu)造函數(shù)到這里到底了.

構(gòu)造函數(shù)的原型對象是否擁有構(gòu)造函數(shù)

 擁有, 你糊了, 原型對象本身就擁有一個 constructor 屬性, 指向構(gòu)造函數(shù)本身.

補(bǔ)充:
下面說的是一個規(guī)則, 不是一個推導(dǎo)

 原型對象本身同樣擁有一個內(nèi)部屬性 [[prototype]], 指向當(dāng)前構(gòu)造函數(shù)的構(gòu)造函數(shù)的原型對象.
 這種由原型對象構(gòu)建而成的鏈表, 就是原型鏈.
 原型鏈存在的意義, 在于盡可能的共用方法和屬性. 或者其他更多的我不知道的意義.

原型鏈長什么樣子

 "hello"

它的原型鏈條的
第一個原型對象

 "hello".constructor.prototype  // = String.prototype

第二個原型對象

 "hello".constructor.prototype.__proto__  // = Object.prototype

這里不能再用

 "hello".constructor.prototype.constructor.prototype 
 來間接訪問原型對象的構(gòu)造函數(shù)的原型對象了.

說明 constructor.prototype 這個玩意并不靠譜, 在遇見原型對象的時(shí)候就不好用了。

第三個原型對象

 "hello".constructor.prototype.__proto__.__proto__  == null;

說明到底了.

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/88289.html

相關(guān)文章

  • JS 進(jìn)階 (一)作用域深入和面向?qū)ο?/b>

    摘要:進(jìn)階第一章作用域深入和面向?qū)ο箢A(yù)解釋全局作用域當(dāng)瀏覽器加載頁面的時(shí)候,提供了一個全局代碼執(zhí)行的環(huán)境預(yù)解釋變量提升在當(dāng)前的作用域中,代碼執(zhí)行之前,瀏覽器首先會默認(rèn)的吧所有帶有和的進(jìn)行提前聲明或定義理解聲明和定義聲明告訴瀏覽器在全局作用域中有 JS進(jìn)階 第一章作用域深入和面向?qū)ο?預(yù)解釋 1、全局作用域:當(dāng)瀏覽器加載HTML頁面的時(shí)候,提供了一個全局js代碼執(zhí)行的環(huán)境 2、預(yù)解釋(變量提升...

    chengtao1633 評論0 收藏0
  • javascript基礎(chǔ)學(xué)習(xí)

    摘要:預(yù)解釋變量和函數(shù)的預(yù)解釋只發(fā)生在當(dāng)前的作用于中中內(nèi)存的分類棧內(nèi)存用來提供一個代碼指定的環(huán)境作用域全局作用域和局部作用域堆內(nèi)存用來存儲引用類型的值對象存儲的是鍵值對,函數(shù)儲存的是字符串函數(shù)執(zhí)行的時(shí)候形成一個私有作用域有形參給形參賦值,形參也 預(yù)解釋 變量和函數(shù)的預(yù)解釋只發(fā)生在當(dāng)前的作用于中 js中內(nèi)存的分類 棧內(nèi)存:用來提供一個js代碼指定的環(huán)境 —>作用域(全局作用域和局部作用域...

    魏明 評論0 收藏0
  • 用小豬佩奇說明Javascript原型原型

    摘要:它指向構(gòu)造函數(shù)的原型對象這是原型對象上的一個指向構(gòu)造函數(shù)的屬性。先看代碼的構(gòu)造函數(shù)創(chuàng)建一個的實(shí)例,小豬佩奇敲黑板,劃重點(diǎn),理解這一句整個問題的關(guān)鍵,請多重復(fù)幾遍。也就是說小豬佩奇的原型,就是從繼承來的寫成代碼就是這個樣子。 ??沒錯,我就是標(biāo)題黨!你已經(jīng)成功被我騙進(jìn)來了。來都來了,那就聊聊再走唄!接下來就聽我一本正經(jīng)地跟你說道說道。 ??Javascript的原型是這門語言的一個重點(diǎn)和...

    vibiu 評論0 收藏0
  • 前端面試筆記 - js相關(guān)

    摘要:將單個事件綁定在父對象上,利用冒泡機(jī)制監(jiān)聽來自子元素的事件。事件目標(biāo)當(dāng)?shù)竭_(dá)目標(biāo)元素之后,執(zhí)行目標(biāo)元素該事件相應(yīng)的處理函數(shù)。函數(shù)對象當(dāng)使用去調(diào)用構(gòu)造函數(shù)時(shí),相當(dāng)于執(zhí)行了原型對象上都有個預(yù)定義的屬性,用來引用它的函數(shù)對象。 請解釋事件代理 (event delegation)。 將單個事件綁定在父對象上,利用冒泡機(jī)制,監(jiān)聽來自子元素的事件。 優(yōu)點(diǎn):解決子元素增加刪除時(shí)候的事件處理,防止內(nèi)存...

    Dogee 評論0 收藏0
  • 前端面試題收集,持續(xù)更新中

    摘要:對于所訪問的每個元素,函數(shù)應(yīng)該將該元素傳遞給所提供的回調(diào)函數(shù)。 HTML 在線閱讀Github地址 題目列表 HTML HTML和XHTML的區(qū)別 Html的語義化 Doctype的文檔類型 cookie、sessionSttorage、localStory區(qū)別 HTML全局屬性(global attribute)有哪些? 常見的瀏覽器內(nèi)核有哪些? 介紹一下你對瀏覽器內(nèi)核的理解?...

    kgbook 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<