亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 網站 > WEB開發 > 正文

javascript函數與對象對象深入了解

2024-04-27 15:06:14
字體:
來源:轉載
供稿:網友

PRototype

每一個函數對象都有一個顯示的prototype屬性,它代表了函數對象的原型(Function.prototype函數對象是個例外,沒有prototype屬性,)。

__proto__

每個普通對象都有一個名為__proto__的內部隱藏屬性,指向于它所對應的構造函數的原型對象(Chrome、Firefox中名稱為__proto__,并且可以被訪問到)。原型鏈正是基于__proto__才得以形成(note:不是基于函數對象的屬性prototype)。

所有構造器/函數對象(包括自定義的)都是有Function構造的,所以其__proto__都指向Function.prototype,它是一個空函數(Empty function)。

<script type="text/javascript">	console.log(Number.__proto__   === Function.prototype) // true  	console.log(Boolean.__proto__  === Function.prototype) // true  	console.log(String.__proto__   === Function.prototype) // true  	console.log(Object.__proto__   === Function.prototype) // true  	console.log(Function.__proto__ === Function.prototype) // true   	console.log(Array.__proto__    === Function.prototype) // true  	console.log(RegExp.__proto__   === Function.prototype) // true  	console.log(Error.__proto__    === Function.prototype) // true  	console.log(Date.__proto__     === Function.prototype) // true 	var Employee = function (){  	  	};  	  	function Person(){  	  	}  	console.log(Employee.__proto__  === Function.prototype);//true  	console.log(Person.__proto__ === Function.prototype);//true   </script>

Javascript中有內置(build-in)構造器/對象共計12個(ES5中新加了JSON),這里列舉了可訪問的8個構造器。剩下如Global不能直接訪問,Arguments僅在函數調用時由JS引擎創建,Math,JSON是以對象形式存在的,無需new。它們的__proto__是Object.prototype。如下:  
<script type="text/javascript">	console.log(Math.__proto__ === Object.prototype);//true  	console.log(JSON.__proto__ === Object.prototype);//true   </script>由以上測試得出,所有的構造器都來自于Function.prototype,甚至包括根構造器Object及Function自身。所有構造器都繼承了Function.prototype的屬性及方法。如length、call、apply、bind(ES5)。另,Function.prototype也是唯一一個typeof XXX.prototype為 “function”的prototype。其它的構造器的prototype都是一個普通對象,下面來測試下:
<script type="text/javascript">	console.log(typeof Function.prototype) // function  	console.log(typeof Object.prototype)   // object  	console.log(typeof Number.prototype)   // object  	console.log(typeof Boolean.prototype)  // object  	console.log(typeof String.prototype)   // object  	console.log(typeof Array.prototype)    // object  	console.log(typeof RegExp.prototype)   // object  	console.log(typeof Error.prototype)    // object  	console.log(typeof Date.prototype)     // object  	console.log(typeof Object.prototype)   // object  </script>

所有普通對象的__proto__都指向其構造器的prototype

<script type="text/javascript">	function Foo(){  	  	}  	var foo = new Foo();//對象實例化  	console.log(foo.__proto__ === Foo.prototype);//true		var obj = new Object();	console.log(obj.__proto__ === Object.prototype);//true</script>

constuctor

每個函數對象都有名為“prototype”的屬性(上面提到過Function.prototype函數對象是個例外,沒有prototype屬性),用于引用原型對象。此原型對象又有名為“constructor”的屬性,它反過來引用函數本身。這是一種循環引用。
<script type="text/javascript">	var   arr = ["aaa", "bbb"],  	console.log(arr.constructor === Array);//true  	function Foo(){    	}  	console.log(Foo.prototype.constructor === Foo);//true   </script>

Function、Object、Prototype、__proto__內存關系圖

  堆區圖說明: Function.prototype函數對象圖內部表示prototype屬性的紅色虛框,只是為了說明這個屬性不存在。通過上面這張圖可以得出以下幾點:所有對象,包括函數對象的原型鏈最終都指向了Object.prototype,而Object.prototype.__proto__===null,原型鏈至此結束。Animal.prototype是一個普通對象。Object是一個函數對象,也是Function構造的,Object.prototype是一個普通對象。Object.prototype.__type__指向null。Function.prototype是一個函數對象,前面說函數對象都有一個顯示的prototype屬性,但是Function.prototype卻沒有prototype屬性,Function.prototype.prototype===undefined,所以Function.prototype函數對象是一個特例,沒有prototype屬性。

函數與對象的關系

函數也是對象(函數對象),普通對象是由函數對象創建的,從前面的描述可以知道所有的函數對象中只有Function.prototype沒有prototype,可以認為所有的構造器(函數對象)都是由Function創建的,Function是頂級構造器。Function.prototype是一個特殊的函數對象,其__proto__指向的是Object.prototype。Function.prototype這個特殊的函數對象主要用來給函數對象定義一些系統內置的函數和屬性,如apply,call,length,arguments等。
<script type="text/javascript">	console.log(Function.prototype);//function(){},空函數	console.log(Function.prototype.constructor);//function Function(){ [native code] },Function構造器	console.log(Function.prototype.__proto__);//Object{}	console.log(Object.prototype);//Object{}	console.log(Object.prototype.constructor);function Obeject(){},Object構造器	console.log(Object.prototype.__proto__);//null</script>

普通對象的創建過程

<script type="text/javascript">  	function Foo(num){};	var foo = new Foo(1);</script>  當執行new Foo(1)時:javascript引擎在內存中開辟一塊新的內存,一個新對象被創建。修改新對象的__proto__,指向Foo.prototype,它繼承自Foo.prototype。構造函數 Foo 被執行。執行的時候,相應的傳參會被傳入,同時上下文(this)會被指定為這個新實例。new Foo 等同于 new Foo(), 只能用在不傳遞任何參數的情況。如果構造函數返回了一個“對象”,那么這個對象會取代整個new出來的結果。如果構造函數沒有返回對象,那么new出來的結果為步驟1創建的對象。
<script type="text/javascript">  	function Foo1(num){		return 1;	};	var foo1 = new Foo1(1);	console.log(foo1.__proto__);Foo1{}	function Foo2(){		return {};//返回對象,會覆蓋new出來的對象	};	var foo2 = new Foo2;	console.log(foo2.__proto__);//Object{}</script>  

instaceof操作符

語法
object instanceof constructor描述instanceof 運算符用來檢測 constructor.prototype 是否存在于參數 object 的原型鏈上
<script type="text/javascript">	console.log(Function.__proto__);//function(){}	console.log(Function.prototype);//function(){}	console.log(Function.prototype.__proto__);//Object對象	console.log("-----------------------");	console.log(Object.__proto__);//function(){}	console.log(Object.prototype);//Object對象	console.log(Object.prototype.__proto__);//null	console.log(Function.__proto__==Object.__proto__);//true	console.log(Object.prototype == Function.prototype.__proto__);//true	console.log(Function instanceof Object);//true	console.log(Function.prototype == Object.__proto__);//true	console.log(Object instanceof Function);//true	console.log(Function.prototype == Function.__proto__);//true	console.log(Function instanceof Function);//true</script>參考:http://blog.csdn.net/cuew1987/article/details/15498121http://www.blogjava.net/heavensay/archive/2013/10/20/405440.html
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
欧美激情2020午夜免费观看| 午夜精品蜜臀一区二区三区免费| xxav国产精品美女主播| 国产69精品99久久久久久宅男| 一本大道香蕉久在线播放29| 日本不卡免费高清视频| 久久久久国产精品一区| 欧美激情在线播放| 国产精品亚洲аv天堂网| www.xxxx精品| 国产99久久精品一区二区永久免费| 日韩电影视频免费| 午夜精品久久久久久久男人的天堂| 亚洲国产天堂久久综合网| 色诱女教师一区二区三区| 91免费欧美精品| 日本精品久久久| 亚洲第一级黄色片| 亚洲а∨天堂久久精品喷水| 亚洲黄色在线看| 亚洲精品中文字| 精品国产乱码久久久久久虫虫漫画| 亚洲精品aⅴ中文字幕乱码| xxxx性欧美| 欧美视频一二三| 欧美夫妻性生活视频| 欧美日韩另类字幕中文| 自拍亚洲一区欧美另类| 7777免费精品视频| 亚洲黄色有码视频| 亚洲第一福利视频| 国产欧美日韩亚洲精品| 欧美在线中文字幕| 国产成人精品日本亚洲专区61| 国产精品成人在线| 国产精品99久久久久久白浆小说| 欧美精品xxx| 91麻豆国产精品| 精品日韩视频在线观看| 国产精品自产拍在线观看中文| 久久手机免费视频| 中文字幕亚洲综合| 亚洲va国产va天堂va久久| 欧美电影在线观看完整版| 国产一区二区三区欧美| 国精产品一区一区三区有限在线| 精品精品国产国产自在线| 欧美精品在线观看| 久久久欧美精品| 亚洲国产精品推荐| 欧美日韩国产精品一区二区三区四区| 在线观看成人黄色| 日韩激情在线视频| 深夜福利日韩在线看| 国产精品久久久久久久app| 亚洲第一中文字幕在线观看| 91久久久久久久久久| 日韩一级裸体免费视频| 欧美成人网在线| 97精品国产aⅴ7777| 欧美高清自拍一区| 国产精品亚洲自拍| 亚洲一区二区三区香蕉| 亚洲成人黄色网| 亚洲最新中文字幕| 狠狠色狠色综合曰曰| 91精品国产九九九久久久亚洲| 国产精品福利在线| 日韩美女视频免费在线观看| 欧美老女人在线视频| 久久视频在线观看免费| 国产精品美女久久久久久免费| 日韩av在线一区二区| 久久久久免费精品国产| 久色乳综合思思在线视频| 亚洲精品一区二区久| 精品亚洲一区二区三区四区五区| 精品久久香蕉国产线看观看亚洲| 国产91在线播放精品91| 国产亚洲一区二区在线| 欧美国产第一页| 九九热精品视频国产| 欧美视频免费在线| 色多多国产成人永久免费网站| 尤物yw午夜国产精品视频明星| 欧美电影在线观看网站| 久久av中文字幕| 久久69精品久久久久久久电影好| 欧美影院久久久| 亚洲在线观看视频网站| 欧美成人精品在线视频| 日韩电影视频免费| 国产精品久久久久99| 91高清免费视频| 国产精品久久久久久久午夜| 97视频在线观看免费| 欧美人与性动交| 性欧美办公室18xxxxhd| 亚洲欧美中文日韩v在线观看| 国产极品精品在线观看| 91精品久久久久久久| 久久精品视频免费播放| 欧美影院成年免费版| 欧美激情视频在线观看| 性色av一区二区三区在线观看| 国产激情综合五月久久| 91欧美精品午夜性色福利在线| 亚洲色图日韩av| 亚洲自拍偷拍一区| 午夜精品理论片| 国产成人精品一区二区在线| 欧美电影免费在线观看| 欧美成人免费va影院高清| 午夜精品久久久久久久久久久久| 美日韩精品免费视频| 精品国产91乱高清在线观看| 91高潮在线观看| 欧美激情按摩在线| 亚洲石原莉奈一区二区在线观看| 亚洲国产精品一区二区三区| 97国产精品免费视频| 精品免费在线观看| 欧美黑人性视频| 欧美xxxx综合视频| 国产精品福利无圣光在线一区| 亚洲欧洲国产伦综合| 亚洲最大福利视频网站| 成人羞羞国产免费| 国产精品电影一区| 欧美性感美女h网站在线观看免费| 欧美激情2020午夜免费观看| 亚洲色图50p| 欧美成人中文字幕在线| 日韩最新在线视频| 亚洲人成在线观看| 日韩av高清不卡| 国产成人中文字幕| 国产成人精品久久| 亚洲天堂免费视频| 日韩中文字幕在线视频播放| 国产精品成人国产乱一区| 国产精品福利在线观看| 久久国产精品亚洲| 亚洲free性xxxx护士hd| 亚洲精品中文字幕av| 国产午夜精品全部视频播放| 亚洲专区中文字幕| 久久视频在线播放| 7m精品福利视频导航| 亚洲最大福利视频网站| 欧美性做爰毛片| 欧美综合激情网| 97视频在线观看免费| 亚洲国产精品久久| 中文字幕亚洲欧美日韩在线不卡| 欧美黑人性猛交| 久久九九国产精品怡红院| 国模精品系列视频| 亚洲最大福利视频| 精品亚洲永久免费精品| 日本欧美精品在线| 日韩有码片在线观看| 成人午夜在线影院| 日韩精品在线观看一区|