最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Javascript new關(guān)鍵字的玄機(jī) 以及其它

 更新時(shí)間:2010年08月25日 19:47:34   作者:  
本人是Javascript菜鳥(niǎo),下面是前幾天學(xué)習(xí)Javascript的旅程心得,希望對(duì)和我一樣的入門(mén)者有點(diǎn)用,也希望高手批評(píng)指正。

接上)先看張對(duì)老手不新鮮但對(duì)菜鳥(niǎo)很有趣的圖:

    

What the heck is that? 簡(jiǎn)直是luan lun。

 

new

拋開(kāi)上面的圖,先看看上篇文章留下的第二個(gè)問(wèn)題,讓我們?cè)跇?gòu)造器的函數(shù)體內(nèi)加點(diǎn)東西,看會(huì)發(fā)生什么。

 

function A(){this.p = 1}
var a = new A()

會(huì)得到如下結(jié)果:

    

為什么用new關(guān)鍵字構(gòu)造出來(lái)的a,會(huì)獲得p這個(gè)屬性?new A()這行代碼做了什么事情?根據(jù)上篇文章中Function的創(chuàng)建過(guò)程第4步,A這個(gè)對(duì)象會(huì)有一個(gè)Construct屬性(注意不是constructor,Consturct是ECMAScript標(biāo)準(zhǔn)里的屬性,好像對(duì)外不可見(jiàn)),該屬性的值是個(gè)函數(shù),new A()即會(huì)調(diào)用A的這個(gè)Construct函數(shù)。那么這個(gè)Construct函數(shù)會(huì)做些啥呢?

  1, 創(chuàng)建一個(gè)object,假設(shè)叫x。

  2, 如果A.prototype是個(gè)object(一般都是),則把A.prototype賦給x.__proto__;否則(不常見(jiàn)),請(qǐng)大老板Object出馬,把Object.prototype賦給x.__proto__。

  3, 調(diào)用A.call(x),第一個(gè)參數(shù)傳入我們剛剛創(chuàng)建的x。這就妥了,A的函數(shù)體里this.p = 1,這個(gè)this,就成了x。因此x就有了p這個(gè)屬性,并且x.p = 1。

  4, 一般情況下,就返回x了,這時(shí)a就是x了。但也有特殊情況,如果A的函數(shù)體里返回的東西,它的類(lèi)型(typeof)是個(gè)object。那么a就不是指向x了,而是指向A函數(shù)返回的東西。

偽代碼如下:

 

var x = new Object(); //事實(shí)上不一定用new來(lái)創(chuàng)建,我也不清楚。
x.__proto__ = A.prototype
var result = A.call(x)
if (typeof(result) == "object"){
return result;
}
return x;

 

 

 

在我們的例子里,A函數(shù)返回undefined(因?yàn)闆](méi)有return字眼),所以a就是x。但我們舉個(gè)例子,驗(yàn)證下上面第4步里的特殊情況:

    

果然。

 

對(duì)象的constructor屬性

再看看上篇文章留下的第一個(gè)問(wèn)題

 

function Base(){}
Base.prototype.a
= 1
var base = new Base();

function Derived(){}
Derived.prototype
= base;
var d = new Derived()

 

 

執(zhí)行完上面的代碼,mybase.constructor很容易猜到是Base,那么d.constructor呢?是Derived嗎?

     

不對(duì),也是Base,怎么回事?很簡(jiǎn)單,復(fù)習(xí)下上篇的內(nèi)容就知道:由于d本身沒(méi)有constructor屬性,所以會(huì)到d.__proto__上去找,d.__proto__就是Derived.prototype,也就是base這個(gè)對(duì)象,base也沒(méi)constructor屬性,于是再往上,到base.__proto__上找,也就是Base.prototype。它是有constructor屬性的,就是Base本身。事實(shí)上,就我目前所知,只有構(gòu)造器(function類(lèi)型的object)的prototype,才真正自己擁有constructor屬性的對(duì)象,且“構(gòu)造器.prototype.constructor === 構(gòu)造器”。

 

Instanceof

那么,instanceof怎么樣?

    

從圖中可以看出,d是Base、Derived和Object的實(shí)例。很合理,但這是怎么判斷的呢?是這樣的:對(duì)于x instanceof constructor的表達(dá)式,如果constructor.prototype在x的原型(__proto__)鏈里,那么就返回true。很顯然,d的__proto__鏈往上依次是:Derived.prototype, Base.prototype, Object.prototype,得到圖中結(jié)果就毫無(wú)疑問(wèn)了。所以,instanceof跟對(duì)象的constructor屬性無(wú)關(guān)。

 

Function and Object

最后解答一下文章開(kāi)頭的圖。

Function和Object本身也是function類(lèi)型的對(duì)象,因此可以說(shuō)都是Function()構(gòu)造出來(lái)的東西(自己構(gòu)造自己,我不知道具體是不是這樣,但就這么認(rèn)為,挺合理的。)

也就是說(shuō),可以設(shè)想如下代碼:

 

var Function = new Function()
var Object = new Function()

 

 

根據(jù)上篇文章的規(guī)律,會(huì)有Function.__proto__ === Function.prototype,以及Object.__proto__ === Function.prototype,驗(yàn)證一下:

    

Function instanceof Object,這是顯然為true的,萬(wàn)物歸Object管,F(xiàn)unction的__proto__鏈依次指向:Function.prototype,Object.prototype。

Object instanceof Function,因?yàn)镕unction.prototype在Object的__proto__鏈中,所以也為true。

相關(guān)文章

  • 網(wǎng)頁(yè)掛馬方式整理及詳細(xì)介紹

    網(wǎng)頁(yè)掛馬方式整理及詳細(xì)介紹

    這篇文章主要介紹了網(wǎng)頁(yè)掛馬方式整理及詳細(xì)介紹的相關(guān)資料,這里整理了不少方式,大家可以看下如何實(shí)現(xiàn)的,需要的朋友可以參考下
    2016-11-11
  • JS表單提交中onsubmit事件return的作用詳解

    JS表單提交中onsubmit事件return的作用詳解

    這篇文章主要為大家介紹了JS表單提交中onsubmit事件return的作用詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-10-10
  • 點(diǎn)擊提交按鈕后按鈕變灰色不可用狀態(tài)的三種方法

    點(diǎn)擊提交按鈕后按鈕變灰色不可用狀態(tài)的三種方法

    當(dāng)點(diǎn)擊提交后,提交按鈕變灰色不可用,這樣可有效防止重復(fù)提交,本代碼就是實(shí)現(xiàn)這樣一個(gè)功能
    2013-09-09
  • js判斷文本框輸入的內(nèi)容是否為數(shù)字

    js判斷文本框輸入的內(nèi)容是否為數(shù)字

    這篇文章主要介紹了js判斷文本框輸入的內(nèi)容是否為數(shù)字,本文為大家分享了驗(yàn)證文本框中的內(nèi)容是否為數(shù)字的方法,感興趣的小伙伴們可以參考一下
    2015-12-12
  • 關(guān)于js二維數(shù)組和多維數(shù)組的定義聲明(詳解)

    關(guān)于js二維數(shù)組和多維數(shù)組的定義聲明(詳解)

    下面小編就為大家?guī)?lái)一篇關(guān)于js二維數(shù)組和多維數(shù)組的定義聲明(詳解)。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2016-10-10
  • Ubuntu 11.10 安裝Node.js的方法

    Ubuntu 11.10 安裝Node.js的方法

    Ubuntu 11.10 安裝Node.js的方法,需要的朋友可以參考下。
    2011-11-11
  • 使用javascript做在線算法編程

    使用javascript做在線算法編程

    這篇文章主要介紹了使用javascript做在線算法編程的相關(guān)知識(shí),需要的朋友可以參考下
    2018-05-05
  • uniapp小程序?qū)崙?zhàn)之利用騰訊地圖獲取定位

    uniapp小程序?qū)崙?zhàn)之利用騰訊地圖獲取定位

    使用uniapp是因?yàn)樗且粋€(gè)使用vue.js開(kāi)發(fā)所有前端應(yīng)用的框架,開(kāi)發(fā)者編寫(xiě)一套代碼,可以發(fā)布到ios,android,web以及各種小程序,快應(yīng)用等多個(gè)平臺(tái),下面這篇文章主要給大家介紹了關(guān)于uniapp小程序?qū)崙?zhàn)之利用騰訊地圖獲取定位的相關(guān)資料,需要的朋友可以參考下
    2023-02-02
  • 客戶(hù)端JavaScript的線程池設(shè)計(jì)詳解

    客戶(hù)端JavaScript的線程池設(shè)計(jì)詳解

    這篇文章主要為大家介紹了客戶(hù)端JavaScript的線程池設(shè)計(jì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來(lái)幫助
    2022-01-01
  • javascript中sort() 方法使用詳解

    javascript中sort() 方法使用詳解

    sort()方法主要是用于對(duì)數(shù)組進(jìn)行排序,默認(rèn)情況下該方法是將數(shù)組元素轉(zhuǎn)換成字符串,然后按照ASC碼進(jìn)行排序,這個(gè)大家都能理解,但如果數(shù)組元素是一個(gè)Object呢,轉(zhuǎn)不了字符串,難道不能進(jìn)行排序?答案當(dāng)然是否定的,那么我們就來(lái)詳細(xì)探討下sort()方法的使用
    2015-08-08

最新評(píng)論

东兰县| 新绛县| 铁岭市| 宝坻区| 朝阳市| 恩施市| 安平县| 布尔津县| 修水县| 行唐县| 定远县| 扶风县| 阿城市| 喜德县| 开鲁县| 普定县| 乐陵市| 黄石市| 贞丰县| 屏山县| 大冶市| 肥东县| 米林县| 东乡族自治县| 宜川县| 南川市| 涟水县| 盘山县| 谷城县| 双柏县| 隆回县| 万宁市| 元阳县| 施甸县| 泾源县| 衢州市| 福安市| 浏阳市| 潍坊市| 托克逊县| 花莲市|