真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

Javascript繼承機(jī)制的設(shè)計(jì)原理是什么

這篇文章主要講解了“Javascript繼承機(jī)制的設(shè)計(jì)原理是什么”,文中的講解內(nèi)容簡單清晰,易于學(xué)習(xí)與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學(xué)習(xí)“Javascript繼承機(jī)制的設(shè)計(jì)原理是什么”吧!

成都創(chuàng)新互聯(lián)公司是專業(yè)的沁水網(wǎng)站建設(shè)公司,沁水接單;提供網(wǎng)站制作、做網(wǎng)站,網(wǎng)頁設(shè)計(jì),網(wǎng)站設(shè)計(jì),建網(wǎng)站,PHP網(wǎng)站建設(shè)等專業(yè)做網(wǎng)站服務(wù);采用PHP框架,可快速的進(jìn)行沁水網(wǎng)站開發(fā)網(wǎng)頁制作和功能擴(kuò)展;專業(yè)做搜索引擎喜愛的網(wǎng)站,專業(yè)的做網(wǎng)站團(tuán)隊(duì),希望更多企業(yè)前來合作!

Javascript本身是從Perl語言的語法演變而來的,本質(zhì)上是腳本語言,隨著版本的更新逐漸加入的對面向?qū)ο蟮哪M。我一直很難理解Javascript語言的繼承機(jī)制。

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

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

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

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

一、從古代說起

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

1994年,網(wǎng)景公司(Netscape)發(fā)布了Navigator瀏覽器0.9版。這是歷史上***個(gè)比較成熟的網(wǎng)絡(luò)瀏覽器,轟動一時(shí)。但是,這個(gè)版本的瀏覽器只能用來瀏覽,不具備與訪問者互動的能力。

比如,如果網(wǎng)頁上有一欄"用戶名"要求填寫,瀏覽器就無法判斷訪問者是否真的填寫了,只有讓服務(wù)器端判斷。如果沒有填寫,服務(wù)器端就返回錯(cuò)誤,要求用戶重新填寫,這太浪費(fèi)時(shí)間和服務(wù)器資源了。

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

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

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

二、Brendan Eich的選擇

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

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

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

C++的寫法是:

ClassName *object = new ClassName(param);

Java的寫法是:

Foo foo = new Foo();

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

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

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

function DOG(name)  {  this.name = name;  }

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

var dogA = new DOG('大毛');  alert(dogA.name); // 大毛

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

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

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

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

function DOG(name)  {  this.name = name;  this.species = '犬科';  }

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

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

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

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

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

四、prototype屬性的引入

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

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

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

還是以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對象里,是兩個(gè)實(shí)例對象共享的。只要修改了prototype對象,就會同時(shí)影響到兩個(gè)實(shí)例對象。

DOG.prototype.species = '貓科';   alert(dogA.species); // 貓科  alert(dogB.species); // 貓科

五、總結(jié)

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

感謝各位的閱讀,以上就是“Javascript繼承機(jī)制的設(shè)計(jì)原理是什么”的內(nèi)容了,經(jīng)過本文的學(xué)習(xí)后,相信大家對Javascript繼承機(jī)制的設(shè)計(jì)原理是什么這一問題有了更深刻的體會,具體使用情況還需要大家實(shí)踐驗(yàn)證。這里是創(chuàng)新互聯(lián),小編將為大家推送更多相關(guān)知識點(diǎn)的文章,歡迎關(guān)注!


當(dāng)前文章:Javascript繼承機(jī)制的設(shè)計(jì)原理是什么
分享鏈接:http://weahome.cn/article/jsoicp.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部