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

Javascript繼承機(jī)制的設(shè)計(jì)思想

  作者: 阮一峰

  日期: 2011年6月 5日

  我一直很難理解Javascript語(yǔ)言的繼承機(jī)制。

  它沒有"子類"和"父類"的概念,也沒有"類"(class)和"實(shí)例"(instance)的區(qū)分,全靠一種很奇特的"原型鏈"(prototype chain)模式,來實(shí)現(xiàn)繼承。

  我花了很多時(shí)間,學(xué)習(xí)這個(gè)部分,還做了很多筆記。但是都屬于強(qiáng)行記憶,無法從根本上理解。

  直到昨天,我讀到法國(guó)程序員Vjeux的解釋,才恍然大悟,完全明白了Javascript為什么這樣設(shè)計(jì)。

  下面,我嘗試用自己的語(yǔ)言,來解釋它的設(shè)計(jì)思想。徹底說明白prototype對(duì)象到底是怎么回事。其實(shí)根本就沒那么復(fù)雜,真相非常簡(jiǎn)單。

  一、從古代說起

  要理解Javascript的設(shè)計(jì)思想,必須從它的誕生說起。

  1994年,網(wǎng)景公司(NETscape)發(fā)布了Navigator瀏覽器0.9版。這是歷史上第一個(gè)比較成熟的網(wǎng)絡(luò)瀏覽器,轟動(dòng)一時(shí)。但是,這個(gè)版本的瀏覽器只能用來瀏覽,不具備與訪問者互動(dòng)的能力。比如,如果網(wǎng)頁(yè)上有一欄"用戶名"要求填寫,瀏覽器就無法判斷訪問者是否真的填寫了,只有讓服務(wù)器端判斷。如果沒有填寫,服務(wù)器端就返回錯(cuò)誤,要求用戶重新填寫,這太浪費(fèi)時(shí)間和服務(wù)器資源了。

  因此,網(wǎng)景公司急需一種網(wǎng)頁(yè)腳本語(yǔ)言,使得瀏覽器可以與網(wǎng)頁(yè)互動(dòng)。工程師Brendan Eich負(fù)責(zé)開發(fā)這種新語(yǔ)言。他覺得,沒必要設(shè)計(jì)得很復(fù)雜,這種語(yǔ)言只要能夠完成一些簡(jiǎn)單操作就夠了,比如判斷用戶有沒有填寫表單。

  1994年正是面向?qū)ο缶幊蹋╫bject-oriented programming)最興盛的時(shí)期,C++是當(dāng)時(shí)最流行的語(yǔ)言,而Java語(yǔ)言的1.0版即將于第二年推出,Sun公司正在大肆造勢(shì)。

  Brendan Eich無疑受到了影響,Javascript里面所有的數(shù)據(jù)類型都是對(duì)象(object),這一點(diǎn)與Java非常相似。但是,他隨即就遇到了一個(gè)難題,到底要不要設(shè)計(jì)"繼承"機(jī)制呢?

  二、Brendan Eich的選擇

  如果真的是一種簡(jiǎn)易的腳本語(yǔ)言,其實(shí)不需要有"繼承"機(jī)制。但是,Javascript里面都是對(duì)象,必須有一種機(jī)制,將所有對(duì)象聯(lián)系起來。所以,Brendan Eich最后還是設(shè)計(jì)了"繼承"。

  但是,他不打算引入"類"(class)的概念,因?yàn)橐坏┯辛?類",Javascript就是一種完整的面向?qū)ο缶幊陶Z(yǔ)言了,這好像有點(diǎn)太正式了,而且增加了初學(xué)者的入門難度。

  他考慮到,C++和Java語(yǔ)言都使用new命令,生成實(shí)例。

  C++的寫法是:

ClassName *object = new ClassName(param);

  Java的寫法是:

Foo foo = new Foo();

  因此,他就把new命令引入了Javascript,用來從原型對(duì)象生成一個(gè)實(shí)例對(duì)象。但是,Javascript沒有"類",怎么來表示原型對(duì)象呢?

  這時(shí),他想到C++和Java使用new命令時(shí),都會(huì)調(diào)用"類"的構(gòu)造函數(shù)(constructor)。他就做了一個(gè)簡(jiǎn)化的設(shè)計(jì),在Javascript語(yǔ)言中,new命令后面跟的不是類,而是構(gòu)造函數(shù)。

  舉例來說,現(xiàn)在有一個(gè)叫做DOG的構(gòu)造函數(shù),表示狗對(duì)象的原型。

function DOG(name){

    this.name = name;

  }

  對(duì)這個(gè)構(gòu)造函數(shù)使用new,就會(huì)生成一個(gè)狗對(duì)象的實(shí)例。

var dogA = new DOG('大毛');

alert(dogA.name); // 大毛

  注意構(gòu)造函數(shù)中的this關(guān)鍵字,它就代表了新創(chuàng)建的實(shí)例對(duì)象。

  三、new運(yùn)算符的缺點(diǎn)

  用構(gòu)造函數(shù)生成實(shí)例對(duì)象,有一個(gè)缺點(diǎn),那就是無法共享屬性和方法。

  比如,在DOG對(duì)象的構(gòu)造函數(shù)中,設(shè)置一個(gè)實(shí)例對(duì)象的共有屬性species。

function DOG(name){

  this.name = name;

  this.species = '犬科';

}

  然后,生成兩個(gè)實(shí)例對(duì)象:

var dogA = new DOG('大毛');

var dogB = new DOG('二毛');

  這兩個(gè)對(duì)象的species屬性是獨(dú)立的,修改其中一個(gè),不會(huì)影響到另一個(gè)。

dogA.species = '貓科';

alert(dogB.species); // 顯示"犬科",不受dogA的影響

  每一個(gè)實(shí)例對(duì)象,都有自己的屬性和方法的副本。這不僅無法做到數(shù)據(jù)共享,也是極大的資源浪費(fèi)。

  四、prototype屬性的引入

  考慮到這一點(diǎn),Brendan Eich決定為構(gòu)造函數(shù)設(shè)置一個(gè)prototype屬性。

  這個(gè)屬性包含一個(gè)對(duì)象(以下簡(jiǎn)稱"prototype對(duì)象"),所有實(shí)例對(duì)象需要共享的屬性和方法,都放在這個(gè)對(duì)象里面;那些不需要共享的屬性和方法,就放在構(gòu)造函數(shù)里面。

  實(shí)例對(duì)象一旦創(chuàng)建,將自動(dòng)引用prototype對(duì)象的屬性和方法。也就是說,實(shí)例對(duì)象的屬性和方法,分成兩種,一種是本地的,另一種是引用的。

  還是以DOG構(gòu)造函數(shù)為例,現(xiàn)在用prototype屬性進(jìn)行改寫:

function DOG(name){

  this.name = name;

}

DOG.prototype = { species : '犬科' };


var dogA = new DOG('大毛');

var dogB = new DOG('二毛');


alert(dogA.species); // 犬科

alert(dogB.species); // 犬科

  現(xiàn)在,species屬性放在prototype對(duì)象里,是兩個(gè)實(shí)例對(duì)象共享的。只要修改了prototype對(duì)象,就會(huì)同時(shí)影響到兩個(gè)實(shí)例對(duì)象。

DOG.prototype.species = '貓科';

alert(dogA.species); // 貓科

alert(dogB.species); // 貓科

  五、總結(jié)

  由于所有的實(shí)例對(duì)象共享同一個(gè)prototype對(duì)象,那么從外界看起來,prototype對(duì)象就好像是實(shí)例對(duì)象的原型,而實(shí)例對(duì)象則好像"繼承"了prototype對(duì)象一樣。

  這就是Javascript繼承機(jī)制的設(shè)計(jì)思想。不知道我說清楚了沒有,繼承機(jī)制的具體應(yīng)用方法,可以參考我寫的系列文章:

  * Javascript面向?qū)ο缶幊蹋ㄒ唬悍庋b》

  * Javascript面向?qū)ο缶幊蹋ǘ簶?gòu)造函數(shù)的繼承》

  * Javascript面向?qū)ο缶幊蹋ㄈ悍菢?gòu)造函數(shù)的繼承》

it知識(shí)庫(kù)Javascript繼承機(jī)制的設(shè)計(jì)思想,轉(zhuǎn)載需保留來源!

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

主站蜘蛛池模板: 在线观看视频国产 | 俄罗斯老妇女BBXX | 一本道久在线综合色色 | 在线观看国产人视频免费中国 | 亚洲美女视频高清在线看 | 99精品热视频30在线热视频 | 国产成人女人视频在线观看 | 白嫩美女直冒白浆 | gogogo在线观看 | 欧美成a人片免费看久久 | 久就热视频精品免费99 | 日韩亚洲人成在线 | 亚洲人成无码久久久AAA片 | 无限好资源免费观看 | 国产精品欧美一区二区在线看 | seba51久久精品| 免费观看桶机十分钟 | 久久国产精品永久网站 | 果冻传媒9CM在线观看 | 超碰97超碰在线视频哦 | 久久中文字幕无线观看 | 亚洲伊人久久大香线蕉综合图片 | 青青国产在线观看视频 | 夜里18款禁用的免费B站动漫 | 九九热这里有精品 | 麻豆国产99在线中文 | 精品国产乱码久久久久久夜深人妻 | 亚洲色大成网站WWW永久麻豆 | 日本十八禁无遮拦啪啪漫画 | 国产色偷偷男人的天堂 | 无限好资源免费观看 | 国产国产乱老熟女视频网站97 | 精品国产乱码久久久人妻 | 魅男mangay| 久青草影院 | 无人区尖叫之夜美女姐姐视频 | 冈本视频黄页正版 | 99视频免费看 | 伊人久久大香 | 日本午夜精品一区二区三区电影 | 久久精品国产亚洲AV未满十八 |