理解Javascript_10_對(duì)象模型
更新時(shí)間:2010年10月16日 00:06:20 作者:
什么都不想說(shuō),一段代碼兩張圖,解釋一切。注:在此之前請(qǐng)閱讀前面的系列博文
對(duì)象模型

紅色虛線表示隱式Prototype鏈。
這張對(duì)象模型圖中包含了太多東西,不少地方需要仔細(xì)體會(huì),可以寫(xiě)些測(cè)試代碼進(jìn)行驗(yàn)證。徹底理解了這張圖,對(duì)JavaScript語(yǔ)言的了解也就差不多了。下面是一些補(bǔ)充說(shuō)明:
1. 圖中有好幾個(gè)地方提到build-in Function constructor,這是同一個(gè)對(duì)象,可以測(cè)試驗(yàn)證:
//Passed in FF2.0, IE7, Opera9.25, Safari3.0.4
Function==Function.constructor //result: true
Function==Function.prototype.constructor //result: true
Function==Object.constructor //result: true
//Function also equals to Number.constructor, String.constructor, Array.constructor, RegExp.constructor, etc.
function fn(){}
Function==fn.constructor //result: true
這說(shuō)明了幾個(gè)問(wèn)題: Function指向系統(tǒng)內(nèi)置的函數(shù)構(gòu)造器(build-in Function constructor);Function具有自舉性;系統(tǒng)中所有函數(shù)都是由Function構(gòu)造。
2. 左下角的obj1, obj2...objn范指用類(lèi)似這樣的代碼創(chuàng)建的對(duì)象: function fn1(){}; var obj1=new fn1();這些對(duì)象沒(méi)有本地constructor方法,但它們將從Prototype鏈上得到一個(gè)繼承的constructor方法,即fn.prototype.constructor,從函數(shù)對(duì)象的構(gòu)造過(guò)程可以知道,它就是fn本身了。
3.右下角的obj1, obj2...objn范指用類(lèi)似這樣的代碼創(chuàng)建的對(duì)象: var obj1=new Object();或var obj1={};或var obj1=new Number(123);或obj1=/\w+/;等等。所以這些對(duì)象Prototype鏈的指向、從Prototype鏈繼承而來(lái)的 constructor的值(指它們的constructor是build-in Number constructor還是build-in Object constructor等)等依賴于具體的對(duì)象類(lèi)型。另外注意的是,var obj=new Object(123);這樣創(chuàng)建的對(duì)象,它的類(lèi)型仍然是Number,即同樣需要根據(jù)參數(shù)值的類(lèi)型來(lái)確定。同樣它們也沒(méi)有本地constructor,而是從Prototype鏈上獲得繼承的constructor方法,即build-in *** constructor,具體是哪一個(gè)由數(shù)據(jù)類(lèi)型確定。
示例代碼
//自定義對(duì)象代表,對(duì)應(yīng)Javascript Object Model中的use defined functions
function Foo(){}
//自定義對(duì)象創(chuàng)建的對(duì)象實(shí)例的代表,對(duì)應(yīng)Javascript Object Model中的objects that created by user defined functions
var foo = new Foo();
//String內(nèi)置函數(shù)代表
//str為內(nèi)置函數(shù)創(chuàng)建的對(duì)象實(shí)例的代表,對(duì)應(yīng)Javascript Object Model中的objects that created by build-in constructors
var str = new String("string");
內(nèi)存展現(xiàn)

你會(huì)發(fā)現(xiàn),它和《理解Javascript_09_Function與Object》中的內(nèi)存分析圖是一樣的,為什么呢?在《數(shù)據(jù)模型》中提到過(guò),內(nèi)置對(duì)象都可以看作是函數(shù)的派生類(lèi)型,例如Number instanceof Function為true,Number instanceof Object為true。在這個(gè)意義上,可以將它們跟用戶定義的函數(shù)等同看待。所以內(nèi)置對(duì)象和自定義對(duì)象的創(chuàng)建流程是一樣的。
在篇博文是在理解了《Function與Object》的基礎(chǔ)上寫(xiě)的,因此要理解本文必須理解Function與Object的關(guān)系!
最后寫(xiě)一點(diǎn)感言:令人發(fā)狂的理論!

紅色虛線表示隱式Prototype鏈。
這張對(duì)象模型圖中包含了太多東西,不少地方需要仔細(xì)體會(huì),可以寫(xiě)些測(cè)試代碼進(jìn)行驗(yàn)證。徹底理解了這張圖,對(duì)JavaScript語(yǔ)言的了解也就差不多了。下面是一些補(bǔ)充說(shuō)明:
1. 圖中有好幾個(gè)地方提到build-in Function constructor,這是同一個(gè)對(duì)象,可以測(cè)試驗(yàn)證:
復(fù)制代碼 代碼如下:
//Passed in FF2.0, IE7, Opera9.25, Safari3.0.4
Function==Function.constructor //result: true
Function==Function.prototype.constructor //result: true
Function==Object.constructor //result: true
//Function also equals to Number.constructor, String.constructor, Array.constructor, RegExp.constructor, etc.
function fn(){}
Function==fn.constructor //result: true
這說(shuō)明了幾個(gè)問(wèn)題: Function指向系統(tǒng)內(nèi)置的函數(shù)構(gòu)造器(build-in Function constructor);Function具有自舉性;系統(tǒng)中所有函數(shù)都是由Function構(gòu)造。
2. 左下角的obj1, obj2...objn范指用類(lèi)似這樣的代碼創(chuàng)建的對(duì)象: function fn1(){}; var obj1=new fn1();這些對(duì)象沒(méi)有本地constructor方法,但它們將從Prototype鏈上得到一個(gè)繼承的constructor方法,即fn.prototype.constructor,從函數(shù)對(duì)象的構(gòu)造過(guò)程可以知道,它就是fn本身了。
3.右下角的obj1, obj2...objn范指用類(lèi)似這樣的代碼創(chuàng)建的對(duì)象: var obj1=new Object();或var obj1={};或var obj1=new Number(123);或obj1=/\w+/;等等。所以這些對(duì)象Prototype鏈的指向、從Prototype鏈繼承而來(lái)的 constructor的值(指它們的constructor是build-in Number constructor還是build-in Object constructor等)等依賴于具體的對(duì)象類(lèi)型。另外注意的是,var obj=new Object(123);這樣創(chuàng)建的對(duì)象,它的類(lèi)型仍然是Number,即同樣需要根據(jù)參數(shù)值的類(lèi)型來(lái)確定。同樣它們也沒(méi)有本地constructor,而是從Prototype鏈上獲得繼承的constructor方法,即build-in *** constructor,具體是哪一個(gè)由數(shù)據(jù)類(lèi)型確定。
示例代碼
復(fù)制代碼 代碼如下:
//自定義對(duì)象代表,對(duì)應(yīng)Javascript Object Model中的use defined functions
function Foo(){}
//自定義對(duì)象創(chuàng)建的對(duì)象實(shí)例的代表,對(duì)應(yīng)Javascript Object Model中的objects that created by user defined functions
var foo = new Foo();
//String內(nèi)置函數(shù)代表
//str為內(nèi)置函數(shù)創(chuàng)建的對(duì)象實(shí)例的代表,對(duì)應(yīng)Javascript Object Model中的objects that created by build-in constructors
var str = new String("string");
內(nèi)存展現(xiàn)

你會(huì)發(fā)現(xiàn),它和《理解Javascript_09_Function與Object》中的內(nèi)存分析圖是一樣的,為什么呢?在《數(shù)據(jù)模型》中提到過(guò),內(nèi)置對(duì)象都可以看作是函數(shù)的派生類(lèi)型,例如Number instanceof Function為true,Number instanceof Object為true。在這個(gè)意義上,可以將它們跟用戶定義的函數(shù)等同看待。所以內(nèi)置對(duì)象和自定義對(duì)象的創(chuàng)建流程是一樣的。
在篇博文是在理解了《Function與Object》的基礎(chǔ)上寫(xiě)的,因此要理解本文必須理解Function與Object的關(guān)系!
最后寫(xiě)一點(diǎn)感言:令人發(fā)狂的理論!
您可能感興趣的文章:
- SharePoint 客戶端對(duì)象模型 (一) ECMA Script
- JavaScript對(duì)象模型-執(zhí)行模型
- 什么是DOM(Document Object Model)文檔對(duì)象模型
- JavaScript 對(duì)象模型 執(zhí)行模型
- 細(xì)品javascript 尋址,閉包,對(duì)象模型和相關(guān)問(wèn)題
- JavaScript 瀏覽器對(duì)象模型BOM使用介紹
- JavaScript Window瀏覽器對(duì)象模型方法與屬性匯總
- C++ 多重繼承和虛擬繼承對(duì)象模型、效率分析
- JavaScript 對(duì)象模型 執(zhí)行模型
- 簡(jiǎn)述JavaScript對(duì)傳統(tǒng)文檔對(duì)象模型的支持
- 深入理解C++的對(duì)象模型
相關(guān)文章
knockoutjs動(dòng)態(tài)加載外部的file作為component中的template數(shù)據(jù)源的實(shí)現(xiàn)方法
Knockoutjs 的Components 是一種自定義的組件,它以一種強(qiáng)大、簡(jiǎn)介的方式將你自己的ui代碼組織成一種單獨(dú)的、可重用的模塊。接下來(lái)通過(guò)本文給大家介紹knockoutjs動(dòng)態(tài)加載外部的file作為component中的template數(shù)據(jù)源的實(shí)現(xiàn)方法,一起看看吧2016-09-09
使弱類(lèi)型的語(yǔ)言JavaScript變強(qiáng)勢(shì)
Javascript (ECMA Script)是一種弱類(lèi)型的語(yǔ)言.這并不意味著它沒(méi)有數(shù)據(jù)類(lèi)型,只是變量或者Javascript對(duì)象屬性不需要一個(gè)特定類(lèi)型的值分配給它或者它始終使用相同的值.Javascript中的變量同樣支持自由類(lèi)型轉(zhuǎn)換成為適用(或者要求)的內(nèi)容以便于使用.2009-06-06
微信小程序?qū)崿F(xiàn)用戶登錄模塊服務(wù)器搭建
這篇文章主要介紹了微信小程序?qū)崿F(xiàn)用戶登錄模塊服務(wù)器搭建,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2021-05-05
利用d3.js制作連線動(dòng)畫(huà)圖與編輯器的方法實(shí)例
這篇文章主要給大家介紹了關(guān)于如何利用d3.js制作連線動(dòng)畫(huà)圖與編輯器的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用d3.js具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-09-09
vue(javaScript)操作字符串的一些常用方法總結(jié)
在平時(shí)前端開(kāi)發(fā)中,我們不難發(fā)現(xiàn)經(jīng)常會(huì)用到字符串操作,這篇文章主要給大家介紹了關(guān)于vue(javaScript)操作字符串的一些常用方法的相關(guān)資料,需要的朋友可以參考下2024-01-01
CocosCreator通用框架設(shè)計(jì)之資源管理
這篇文章主要介紹了CocosCreator通用框架設(shè)計(jì)之資源管理,對(duì)性能優(yōu)化感興趣的同學(xué),一定要看一下2021-04-04
Js控制彈窗實(shí)現(xiàn)在任意分辨率下居中顯示
彈窗居中比較煩人的是怎么才能在任意分辨率下實(shí)現(xiàn)居中顯示,為了解決此問(wèn)題,本文測(cè)試了一下案例在此與大家分享,有類(lèi)似需求的朋友可以學(xué)習(xí)下2013-08-08

