http://m.blog.csdn.net/blog/z1547840014/9734179
當(dāng)用new操作符調(diào)用一個(gè)函數(shù)時(shí),就會(huì)創(chuàng)建一個(gè)新的javascript對(duì)象.接著,該函數(shù)會(huì)作為該新建對(duì)象的this值被調(diào)用,而在原始調(diào)用中所使用的參數(shù)也都將一并傳遞給該函數(shù)調(diào)用
下面我們來研究下使用構(gòu)造器處創(chuàng)建對(duì)象和使用字面量創(chuàng)建對(duì)象的區(qū)別到底是什么,先看下面的代碼
function Circle(radius){
this.radius = radius;
}
var cicr = new Circle(6);
var cicr2 = {radius:6};
上面兩個(gè)對(duì)象都會(huì)擁有2個(gè)屬性,如果對(duì)js這塊熟悉的同學(xué)想必已經(jīng)猜到了這2個(gè)屬性,一個(gè)是radius屬性,另一個(gè)就是從object.prototype繼承而來的屬性.對(duì)于radius屬性,他們沒有任何區(qū)別窿撬。但是對(duì)于這個(gè)原型屬性,內(nèi)部實(shí)現(xiàn)上有細(xì)小的區(qū)別白华。cicr2是直接繼承了object.prototype屬性深胳,而cicr是間接繼承了object.prototype屬性矩动。cicr首先繼承了Circle上的原型屬性,這個(gè)原型屬性又繼承了object.prototype屬性,所以它也完成了對(duì)object.prototype的繼承棕孙。為了得到這種具體的關(guān)系,我們可以使用instanceof和constructor來檢驗(yàn)他們內(nèi)部的實(shí)現(xiàn)細(xì)節(jié)
alert(cicr instanceof Object)
//判斷cicr對(duì)象是否屬于Object對(duì)象,結(jié)果為true
alert(cicr instanceof Circle)
//判斷cicr對(duì)象是否屬于Circle對(duì)象,結(jié)果為true
alert(cicr2 instanceof Object)
//判斷cicr2對(duì)象是否屬于Object對(duì)象,結(jié)果為true
alert(Circle==cicr.constructor) //判斷cicr對(duì)象的構(gòu)造方法是否是Circle,結(jié)果為true
alert(Object==cicr2.constructor) //判斷cicr2對(duì)象的構(gòu)造方法是否是Object,結(jié)果為true
alert(Object==cicr.constructor) //判斷cicr對(duì)象的構(gòu)造方法是否是Object,結(jié)果為false
從上面6個(gè)例子我們可以看出instanceof和constructor的區(qū)別,也可以得到一條用的結(jié)論,即:只要一個(gè)對(duì)象a的內(nèi)部prototype屬性或者它的原型鏈上的任意對(duì)象與b.prototype是同一個(gè)對(duì)象,那么a instanceof b就返回true