天天躁日日躁狠狠躁AV麻豆-天天躁人人躁人人躁狂躁-天天澡夜夜澡人人澡-天天影视香色欲综合网-国产成人女人在线视频观看-国产成人女人视频在线观看

淺析Javascript原型繼承 推薦第1/2頁(yè)

JS沒有提供所謂的類繼承,據(jù)說(shuō)在2.0中要加入這種繼承方式,但是要所有瀏覽器都實(shí)現(xiàn)2.0的特性那肯定又得N多年。昨天看了crockford 的一個(gè)視頻,里面講解了一下JS的繼承方式,按照PPT里面說(shuō)的,一共分了三類:Prototypal,pseudoclassical,Parasitic Inheritance。

下面主要介紹一下原型繼承:When a function object is created, it is given a prototype member which is an object containing a constructor member which is a reference to the function object.


這里先區(qū)別一下什么是prototype屬性,和constructor屬性。也就是要區(qū)別什么是構(gòu)造器,函數(shù),對(duì)象實(shí)例。


其實(shí)在JS中構(gòu)造器就是函數(shù),函數(shù)就是構(gòu)造器,對(duì)象實(shí)例就是通過(guò)var obj=new 函數(shù)();這種形式新建出來(lái)的實(shí)例。區(qū)別這些,在說(shuō)prototype和constructor。從上面的英文中可以看出,prototype是個(gè)對(duì)象,里面定義了一個(gè)constructor,那么我們可以推論出,constructor是對(duì)象實(shí)例的屬性!而不是函數(shù)(構(gòu)造器)的屬性。反過(guò)來(lái),prototype是函數(shù)(構(gòu)造器)的屬性,而不是實(shí)例的屬性!
復(fù)制代碼 代碼如下:
//在下面這個(gè)代碼示例中,MyObj是函數(shù)(構(gòu)造器),obj是實(shí)例
function MyObj(id){
this.id=id;
}
var obj=new MyObj(1);
alert(MyObj.constructor) //本地代碼
alert(obj.constructor) //MyObj.toString()
alert(MyObj.prototype) //[object Object]
alert(obj.prototype) //undefined

我們可以看出MyObj是不具有JS意義下的constructor屬性的,為什么這么說(shuō)呢。alert(MyObj.constructor)這行代碼還是有東西的:


這是因?yàn)镸yObj是個(gè)函數(shù),所以他的構(gòu)造器就是本地的Function對(duì)象,也就是說(shuō)MyObj是由Function構(gòu)造出來(lái)的。但是這個(gè)對(duì)我們意義不大,因?yàn)檫@已經(jīng)不再JS層面上了。所以這里可以認(rèn)為MyObj不具有JS意義下的constrcutor屬性。

alert(obj.prototype)通過(guò)這行我們可以看出,obj實(shí)例是不具有原型屬性的。OK,現(xiàn)在區(qū)別清楚了這些,可以看原型繼承了。如果不區(qū)別清楚這個(gè),恐怕下面會(huì)看的很暈。
復(fù)制代碼 代碼如下:
function Gizmo(id) {
this.id = id;
}
Gizmo.prototype.toString = function () {
return "gizmo " + this.id;
};

function Hoozit(id) {
this.id = id;
}
Hoozit.prototype = new Gizmo();
Hoozit.prototype.test = function (id) {
return this.id === id;
};

注意這行:Hoozit.prototype = new Gizmo();這行就是原型繼承的核心代碼。

還有要注意的是只有在new Gizmo()之后,才能添加test等其它方法,這個(gè)順序不能倒過(guò)來(lái)!如果你先添加了test等方法,然后在new Gizmo(),那么原來(lái)添加的那些方法都將找不到了。具體原因,下面分析完了,也就清楚了。
復(fù)制代碼 代碼如下:
Hoozit.prototype.test = function (id) {
return this.id === id;
};

Hoozit.prototype = new Gizmo(2);

var h=new Hoozit();
alert(h.test(3)); //這里會(huì)報(bào)錯(cuò)!!


仔細(xì)看一下上面的圖,這個(gè)就是原型繼承的圖示。左下角new Hoozit(stirng)代表的是新建的一個(gè)對(duì)象。為了以下表述方便,我們管他叫objH1。最右邊的灰色的箭頭就是原型繼承鏈。

根據(jù)文章開頭的那段英文,我們知道每個(gè)函數(shù)都有一個(gè)原型,這個(gè)原型是個(gè)對(duì)象,并且對(duì)象里面包含一個(gè)constructor屬性。其中Object,Gizmo,Hoozit就是函數(shù),可以看出里面都有一個(gè)prototype項(xiàng),而這個(gè)prototype又指向一個(gè)對(duì)象,這個(gè)對(duì)象里面又有一個(gè)constructor屬性,constructor又指回自身。

復(fù)制代碼 代碼如下:
alert(Gizmo.prototype.constructo===Gizmo) //true

但是這里有一個(gè)意外,我們發(fā)現(xiàn)Hoozit原型對(duì)象里面沒有constructor屬性,而這個(gè)函數(shù)的右邊卻有一個(gè)空的對(duì)象,里面包含了一個(gè)constructor屬性?為什么呢?
這個(gè)問(wèn)題會(huì)發(fā)生在原型繼承過(guò)程中。主要就是因?yàn)镠oozit.prototype = new Gizmo();這句話引起的。這句話的意思就是新建了一個(gè)Gizmo對(duì)象并且賦給Hoozit的原型!那么,那么,仔細(xì)想想,是不是Hoozit原有的原型對(duì)象就被斷開了呢??沒錯(cuò),就是這樣。所以那個(gè)有constructor屬性的空對(duì)象再也訪問(wèn)不到了!
那現(xiàn)在又有一個(gè)疑問(wèn)了,通過(guò)Hoozit.prototype = new Gizmo();這行代碼之后,Hoozit.prototype.constructor指向哪里了呢?很簡(jiǎn)單,知道(new Gizmo()).constructor指向哪里嗎?通過(guò)上面的圖,可以清晰的看出來(lái)指向的是Gizmo函數(shù)。所以我們斷定,現(xiàn)在的Hoozit.prototype.constructor也指向了那里!
復(fù)制代碼 代碼如下:
alert(Hoozit.prototype.constructor===Gizmo); //true

上面這行代碼驗(yàn)證了我們的猜測(cè)!OK,上面講完了函數(shù)(構(gòu)造器一邊),然后我們?cè)賮?lái)說(shuō)實(shí)例對(duì)象這邊:每個(gè)實(shí)例對(duì)象都有一個(gè)constructor屬性,并且指向構(gòu)造器(函數(shù))。而且每個(gè)new出來(lái)的實(shí)例都是某個(gè)原型constructor的實(shí)例:
復(fù)制代碼 代碼如下:
var objG1=new Gizmo()
alert(objG1 instanceof Gizmo.prototype.constructor) //true
alert(Gizmo.prototype.constructor===objG1.constructor); //true

上面為什么不拿objH1舉例呢,因?yàn)樗腸onstructor已經(jīng)不是他自己的了,而是Gizmo對(duì)象的,那么我們驗(yàn)證一下:
復(fù)制代碼 代碼如下:
alert(objH1.constructor===objG1.constructor) //true
alert(objH1 instanceof Gizmo.prototype.constructor) //true

看到了嗎?其實(shí)這個(gè)問(wèn)題也不算什么大問(wèn)題,如果你要不使用instanceof檢查父對(duì)象或者使用constructor進(jìn)行原型回溯的話,這個(gè)問(wèn)題可以不解決了。如果想解決這個(gè)問(wèn)題怎么辦呢?在Prototype框架的Class.create方法里面給出了一種方法,具體可以參考:http://blog.csdn.NET/kittyjie/archive/2009/07/13/4345568.ASPx
下面我簡(jiǎn)單說(shuō)一下兩種方法:

JavaScript技術(shù)淺析Javascript原型繼承 推薦第1/2頁(yè),轉(zhuǎn)載需保留來(lái)源!

鄭重聲明:本文版權(quán)歸原作者所有,轉(zhuǎn)載文章僅為傳播更多信息之目的,如作者信息標(biāo)記有誤,請(qǐng)第一時(shí)間聯(lián)系我們修改或刪除,多謝。

主站蜘蛛池模板: 名女躁b久久天天躁 | 无限资源在线观看高清 | 国产成人综合高清在线观看 | 欧美区一区二 | 动漫AV纯肉无码AV电影网 | 日韩午夜中文字幕电影 | 日本高清片免费观看 | 2020亚洲色噜噜狠狠网站 | 久久操热在线视频精品 | 纯肉高H放荡受BL文库 | 亚洲国产欧美另类 | 国产成人a视频在线观看 | 欧美xxx性| 小蝌蚪视频在线观看免费观看WWW | 黑人性xxx| 强壮的公次次弄得我高潮韩国电影 | 国产盗摄一区二区三区 | 极品色αv影院 | 男女牲交大战免费播放 | 妻子+免费观看完整 | 久久亚洲精品无码A片大香大香 | 欧美区 bt | 精品国产99久久久久久麻豆 | 日韩a视频在线观看 | 动漫女生的逼 | 99热久久这里只有精品视频 | 69国产精品成人无码视频 | 穿白丝袜边走边尿白丝袜 | 99视频精品全部 国产 | 2021国产精品国产精华 | 高H各种PLAY全肉NP | 黑吊大战白女出浆 | 全免费A敌肛交毛片免费懂色AV | 好紧小嫩嫩水的10p 好紧好湿太硬了我太爽了小说 | 交换邻居波多野结衣中文字幕 | 国产乱码精品一区二区三区四川 | A级毛片无码久久精品免费 a级毛片黄免费a级毛片 | 美国特级成人毛片 | 久久久久激情免费观看 | 97在线观看免费视频 | 免费99精品国产自在现线 |