国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > JavaScript > 正文

關(guān)于JavaScript 原型鏈的一點(diǎn)個(gè)人理解

2019-11-20 09:22:32
字體:
供稿:網(wǎng)友

JavaScript借鑒了許多語言的特點(diǎn);例如語法類Java、函數(shù)借鑒Scheme、原型繼承借鑒自Self、正則表達(dá)式借鑒于Perl。(DC Javascript:語言精粹)。

     首先,每個(gè)JS是一門基于原型繼承的面向?qū)ο蟮恼Z言。里面數(shù)組是對(duì)象、函數(shù)是對(duì)象、“對(duì)象”當(dāng)然還是對(duì)象。而且每個(gè)對(duì)象都有一個(gè)internal slot[[prototype]],這才是原型鏈連接起來的關(guān)鍵。誠(chéng)然,我們可以為一個(gè)對(duì)象設(shè)置prototype property,但這又怎么樣呢,這只是表象;后面暗藏殺機(jī)。

    好,那我可以用isPrototypeOf()來檢驗(yàn)?zāi)硞€(gè)對(duì)象是不是另一個(gè)對(duì)象的原型;然而這也是基于[[prototype]]鏈的。

   舉個(gè)例子:

    //建立一個(gè)函數(shù)    function foo () {}     //修改函數(shù)的prototype property      foo.prototype = {         name : "foo.prototype"               };     //建立一個(gè)實(shí)例       var a = new foo();    //重寫 a 的默認(rèn)原型,本應(yīng)該是foo.prototype.       a.prototype = {         name : "a.prototype"      };

    下面的問題是foo.prototype是不是a的原型呢?!

    這要分開來看:一方面a.prototype確實(shí)是{ name : "a.prototype"};但是,foo.prototype.isPrototypeOf(a)結(jié)果是true.

    下面來看一看具體的關(guān)系:(使用--->表示不明顯的[[prototype]]鏈,---表示prototype property關(guān)系)

        Function ---> Function.prototype--->Object.prototype

                          Function.prototype <--- foo---foo.prototype ------>Object.prototype 。

    另外,Number、Boolean、String等的[[protptype]]仍然是Fuction.prototype對(duì)象。Function.prototype對(duì)象為“function”,內(nèi)部不含[[construct]]故而不可做構(gòu)造函數(shù)用;實(shí)際上Function.prototype類似:function () {}。“function”類型除了[[prototype]]internal slot外,還有prototype屬性。每個(gè)函數(shù)總是相伴有一個(gè)prototype對(duì)象:this.prototype = {constructor:this}(一個(gè)普通對(duì)象)。這個(gè)普通對(duì)象的[[prototype]]連接到Object.prototype.

   那構(gòu)造函數(shù)建立的實(shí)例對(duì)象的[[prototype]]是Object.prototype嗎?

          該實(shí)例的[[prototype]]是由構(gòu)造函數(shù)的prototype property初始化的,注意不是函數(shù)的[[prototype]].所以如果是由Object這個(gè)函數(shù)構(gòu)造的對(duì)象,那么就確實(shí)是.

  Object是函數(shù),它的prototype是大名鼎鼎的Object.prototype(有點(diǎn)廢話的意思),但是它的[[prototype]]指向Function.prototype.請(qǐng)看下面:

                                                          Object----->Function.prototype------>Object.prototype.

 如何改變這個(gè)[[prototype]]鏈呢?

     可以采用var a = Object.create(obj)的形式,或Object.setPrototypeOf(objA,objB)的形式。我想例子就不用舉了,因?yàn)殛P(guān)系很簡(jiǎn)單;況且我只舉得出一些蹩腳的例子。沒有意義。

 最后一個(gè)問題,行為委托是基于[[prototype]]鏈嗎?

      是的,也是這樣。

發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 鄂尔多斯市| 枝江市| 桂阳县| 平原县| 甘谷县| 湘乡市| 年辖:市辖区| 正定县| 车致| 彭山县| 垣曲县| 江川县| 日照市| 寿光市| 陇西县| 大洼县| 三河市| 海伦市| 连平县| 滦平县| 固安县| 聂拉木县| 应城市| 武城县| 台湾省| 柳州市| 灵璧县| 顺义区| 射洪县| 南平市| 南陵县| 普兰县| 滨州市| 镇康县| 奈曼旗| 平潭县| 天长市| 沙田区| 玛沁县| 莱阳市| 子洲县|