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

理解Javascript_11_constructor實(shí)現(xiàn)原理

 更新時(shí)間:2010年10月18日 00:46:50   作者:  
在理解了'對(duì)象模型'后,我們就可以看一下constructor屬性是如何實(shí)現(xiàn)的.
constructor是什么

簡(jiǎn)單的理解,constructor指的就是對(duì)象的構(gòu)造函數(shù)。請(qǐng)看如下示例:
復(fù)制代碼 代碼如下:

function Foo(){};
var foo = new Foo();
alert(foo.constructor);//Foo
alert(Foo.constructor);//Function
alert(Object.constructor);//Function
alert(Function.constructor);//Function

對(duì)于foo.constructor為Foo,我想應(yīng)該很好理解,因?yàn)閒oo的構(gòu)造函數(shù)為Foo。對(duì)于Foo、Object、Function的構(gòu)造函數(shù)為Function,我想也沒什么好爭(zhēng)議的。(因?yàn)镕oo,Object,Function都是函數(shù)對(duì)象,又因?yàn)樗械暮瘮?shù)對(duì)象都是Function這個(gè)函數(shù)對(duì)象構(gòu)造出來,所以它們的constructor為Function,詳細(xì)請(qǐng)參考《js_函數(shù)對(duì)象》)

Prototype與Constructor的關(guān)系

復(fù)制代碼 代碼如下:

function Dog(){}
alert(Dog === Dog.prototype.constructor);//true

在 JavaScript 中,每個(gè)函數(shù)都有名為“prototype”的屬性,用于引用原型對(duì)象。此原型對(duì)象又有名為“constructor”的屬性,它反過來引用函數(shù)本身。這是一種循環(huán)引用,如圖:

constructor屬性來自何方
我們來看一下Function構(gòu)造String的構(gòu)造過程:

注:Function構(gòu)造任何函數(shù)對(duì)象的過程都是一樣的,所以說不管是String,Boolean,Number等內(nèi)置對(duì)象,還是用戶自定義對(duì)象,其構(gòu)造過程都和上圖一樣。這里String只是一個(gè)代表而矣!
圖中可以看出constructor是Function在創(chuàng)建函數(shù)對(duì)象時(shí)產(chǎn)生的,也正如'prototype與constructor的關(guān)系'中講的那樣,constructor是函數(shù)對(duì)象prototype鏈中的一個(gè)屬性。即String=== String.prototype.constructor。

我還想用一段代碼來證明一下,理論是正確的:
復(fù)制代碼 代碼如下:

function Person(){}
var p = new Person();
alert(p.constructor);//Person
alert(Person.prototype.constructor);//Person
alert(Person.prototype.hasOwnProperty('constructor'));//true
alert(Person.prototype.isPrototypeOf(p));//true
alert(Object.prototype.isPrototypeOf(p));//true
alert(Person.prototype == Object.prototype);//false

到現(xiàn)在,你會(huì)發(fā)現(xiàn)這和前面《原型鏈的實(shí)現(xiàn)原理》中的默認(rèn)prototype指向Object.prototype有沖突,顯然當(dāng)時(shí)的理論不是很全面。

特別的Object
用心的讀者可能會(huì)提出這樣一問題,你這一套理論并不能適用于Object。因?yàn)橐韵碌拇a和你上面的理論是沖突的:
復(fù)制代碼 代碼如下:

alert(Object.prototype.hasOwnProperty('constructor'));//true
alert(Object.prototype.hasOwnProperty('isPrototypeOf'));//true,如果按上面的理論,這里應(yīng)該返回false

真的是這樣嗎?不是!那我們來看一下特殊的Object是如何處理的:

你會(huì)發(fā)現(xiàn),這圖的原理和上面一張圖的原理是一樣的。這就能正確解釋Object.prototype.hasOwnProperty('isPrototypeOf')為true!

constructor探究
復(fù)制代碼 代碼如下:

function Animal(){}
function Person(){}
var person = new Person();
alert(person.constructor); //Person

根據(jù)上一節(jié)的內(nèi)容,你能正確的理解這段代碼的結(jié)果嗎?思考后,看一下其內(nèi)存表示:

這張圖明確有表明了Function構(gòu)造Animal和Person的過程。同時(shí)也顯示了實(shí)例person與Person的關(guān)系。

再深入一點(diǎn),代碼如下:
復(fù)制代碼 代碼如下:

function Animal(){}
function Person(){}
Person.prototype = new Animal();
var person = new Person();
alert(person.constructor); //Animal

這個(gè)時(shí)候,person的構(gòu)造函數(shù)成了Animal,怎么解釋?

注:圖中的虛線表示Person默認(rèn)的prototype指向(只作參考的作用)。但是我們將Person.prototype指向了new Animal。
此時(shí),Person的prototype指向的是Animal的實(shí)例,所以person的constructor為Animal這個(gè)構(gòu)造函數(shù)。

結(jié)論:constructor的原理非常簡(jiǎn)單,就是在對(duì)象的原型鏈上尋找constructor屬性。

注:如果你無法正確理解本文內(nèi)容,請(qǐng)回顧前面章節(jié)的內(nèi)容。

相關(guān)文章

最新評(píng)論

会昌县| 布尔津县| 竹山县| 炎陵县| 柳林县| 巴里| 中江县| 收藏| 沁源县| 南投县| 郯城县| 宝鸡市| 杭锦后旗| 会泽县| 历史| 清涧县| 拉萨市| 东乌珠穆沁旗| 阿拉善盟| 凉山| 班戈县| 舒兰市| 崇左市| 梓潼县| 宁化县| 宣城市| 荥阳市| 荣成市| 锡林郭勒盟| 张北县| 惠安县| 建水县| 凉城县| 临澧县| 如东县| 临桂县| 浦东新区| 崇文区| 罗源县| 盐亭县| 榆林市|