国产高清一区二区在线_免费看肥胖女人做爰高清全过情_日韩少妇高潮抽搐_性生生活大片又黄又_粉嫩蜜臀av国产精品网站_搞黄视频免费_亚洲成a人一区二区三区_屁股翘起来趴好挨c_少妇一夜爽免费看_日本护士高潮大叫

首頁>> 開發(fā)技術(shù)知識>> 平面廣告設(shè)計(jì)知識>>網(wǎng)站建設(shè)中常用javascript中的對象與函數(shù)和繼承


網(wǎng)站建設(shè)中常用javascript中的對象與函數(shù)和繼承

1、 Javascript中的對象

  JavaScript可以說是一個(gè)基于對象的編程語言,為什么說是基于對象而不是面向?qū)ο,因(yàn)镴avaScript自身只實(shí)現(xiàn)了封裝,而沒有實(shí)現(xiàn)繼承和多態(tài)。既然他是基于對象的,那么我們就來說說js中的對象。有人說js中所有的都是對象,這句話不完全正確。正確的一方是他強(qiáng)調(diào)了對象在js中的重要性,對象在js中無處不在,包括可以構(gòu)造對象的函數(shù)本身也是對象。但是另一方面,js中也有一些簡單的數(shù)據(jù)類型,包括數(shù)字、字符串和布爾值、null值和undefined值,而這些不是對象。那為什么這些類型的值不是對象呢,畢竟他們也有方法。那讓我們來看一下,JavaScript中對于對象的定義,有兩種定義。

  (1)JavaScript中的對象是可變的鍵控集合(keyed collections) (此定義來自老道的那本書的第三章)

  (2)JavaScript中的對象是無序(unordered)的屬性集合,這些屬性可以含有簡單的數(shù)據(jù)類型、對象、函數(shù);保存在一個(gè)對象屬性中的函數(shù)也被稱為這個(gè)對象的方法。 (來自ECMA-262 的4.3.3)(注:這里所說的屬性是可以在js腳本中創(chuàng)建和訪問的(我們稱之為顯性屬性),不包括系統(tǒng)為對象自動(dòng)分配的內(nèi)部屬性)

  那為什么那個(gè)簡單的數(shù)據(jù)類型不是對象呢,主要是因?yàn)檫@些數(shù)據(jù)類型的值中擁有的方法是不可變的,而一個(gè)對象的屬性是應(yīng)當(dāng)可以被改變的。

  2、 對象中的原型鏈[[proto]]

  JavaScript中的每個(gè)對象創(chuàng)建的時(shí)候系統(tǒng)都會(huì)自動(dòng)為其分配一個(gè)原型屬性[[proto]],用來連接到他的原型對象。在JavaScript中就是通過每個(gè)對象中的[[proto]]來實(shí)現(xiàn)對象的繼承關(guān)系的。但是對象的[[proto]]屬性在JavaScript是不能訪問和修改的,他是作為一個(gè)內(nèi)部的屬性存在的,而且是在對象被創(chuàng)建的同時(shí)由系統(tǒng)自動(dòng)設(shè)定的。

  當(dāng)訪問一個(gè)對象的某一屬性,如果這個(gè)屬性在此對象中不存在,就在他的[[proto]]所指的原型對象的屬性中尋找,如果找到則返回,否則繼續(xù)沿著[[proto]]鏈一直找下去,直到[[proto]]的連接為null的時(shí)候停止。

  3、 函數(shù)也是對象

  JavaScript中的函數(shù)本身就是一個(gè)對象(所以我們經(jīng)常稱之為函數(shù)對象),而且可以說他是js中最重要的對象。之所以稱之為最重要的對象,一方面他可以扮演像其他語言中的函數(shù)同樣的角色,可以被調(diào)用,可以被傳入?yún)?shù);另一方面他還被作為對象的構(gòu)造器(constructor)來使用,可以結(jié)合new操作符來創(chuàng)建對象。

  既然函數(shù)就是對象,所以必然含有對象擁有的全部性質(zhì),包括對象在創(chuàng)建時(shí)設(shè)定的原型鏈[[proto]]屬性。

  讓我們來看看函數(shù)對象和普通對象有什么區(qū)別。我們前面說過,對象就是無序的屬性集合,那么函數(shù)的屬性和普通對象的屬性有什么不同呢。根據(jù)ECMA-262中的13.2節(jié)所述,在函數(shù)對象創(chuàng)建時(shí),系統(tǒng)會(huì)默認(rèn)為其創(chuàng)建兩個(gè)屬性[[call]]和[[constructor]],當(dāng)函數(shù)對象被當(dāng)做一個(gè)普通函數(shù)調(diào)用的時(shí)候(例如myFunc()),“()”操作符指明函數(shù)對象的[[call]]屬性就被執(zhí)行,當(dāng)他被當(dāng)做一個(gè)構(gòu)造器被調(diào)用的時(shí)候(例如new myConst()),他的[[constructor]]屬性就被執(zhí)行,[[cosntructor]]的執(zhí)行過程我們將在下一節(jié)中介紹。除此之外,當(dāng)一個(gè)函數(shù)被創(chuàng)建時(shí),系統(tǒng)會(huì)默認(rèn)的再為其創(chuàng)建一個(gè)顯示屬性prototype,并為其賦值為

  this.prototype = {constructor:this}

  具體內(nèi)容可以參加老道的那本書的第五章。這個(gè)函數(shù)對象的prototype屬性也是為了js把函數(shù)當(dāng)做構(gòu)造器來實(shí)現(xiàn)繼承是準(zhǔn)備的,但是這個(gè)屬性是可以在js腳本中訪問和修改的。在這里要強(qiáng)調(diào)的一點(diǎn)是,大家一定要區(qū)分對象中的[[proto]]屬性和函數(shù)對象中的prototype屬性,我在剛開始學(xué)習(xí)的時(shí)候就是因?yàn)闆]有很好的區(qū)分這兩個(gè)東西,走了很多的彎路。

  4、 對象的創(chuàng)建

  在js中有兩種創(chuàng)建對象的方法,一種是通過字面量來實(shí)現(xiàn),如

  var Person = {

  “first_name”:’liang’,

  ‘last_name’:’yang’

  }

  另一種方法是通過構(gòu)造器來創(chuàng)建

  var my = new Person(‘liang’,’yang’);

  其實(shí)第一種方式的創(chuàng)建過程相當(dāng)于調(diào)用Object構(gòu)造器來實(shí)現(xiàn),如下。

  var Person = new Object();

  Person.first_name = ‘liang’;

  Person.last_name = ‘yang’

  所以我們可以把js中所有對象的創(chuàng)建都合并到使用構(gòu)造器來實(shí)現(xiàn),下面我么來詳細(xì)說明構(gòu)造器創(chuàng)建對象的過程:

  第一步,先創(chuàng)建一個(gè)空的對象(既沒有任何屬性),并將這個(gè)對象的[[proto]]指向這個(gè)構(gòu)造器函數(shù)的prototype屬性對象

  第二步,將這個(gè)空的對象作為this指針傳給構(gòu)造器函數(shù)并執(zhí)行

  第三步,如果上面的函數(shù)返回一個(gè)對象,則返回這個(gè)對象,否則返回第一步創(chuàng)建的對象

  第四步,把函數(shù)當(dāng)做一個(gè)類來使用

  由上面的步驟我們可以看出,一般來說函數(shù)對象的prototype指向的是一個(gè)普通對象,而不是一個(gè)函數(shù)對象,這個(gè)普通對象中的屬在由此函數(shù)構(gòu)造器創(chuàng)建的對象中也可以訪問。由此可以如此設(shè)計(jì)我們的代碼,假設(shè)一個(gè)函數(shù)就可以代表一個(gè)類,這個(gè)構(gòu)造器函數(shù)生成的對象就是這個(gè)類的實(shí)例對象,那么實(shí)例對象中應(yīng)有的屬性和方法應(yīng)該放在這個(gè)構(gòu)造器函數(shù)的prototype中,這個(gè)類的靜態(tài)方法就可以直接放到這個(gè)函數(shù)作為對象的屬性中,最后這個(gè)函數(shù)體就是我們平時(shí)在面向?qū)ο笳Z言中所說的構(gòu)造函數(shù)(在這里我們要區(qū)分連個(gè)詞“構(gòu)造函數(shù)”和“構(gòu)造器函數(shù)”,所謂構(gòu)造函數(shù)是指普通的面向?qū)ο笳Z言中的類的構(gòu)造函數(shù),而構(gòu)造器函數(shù)是指javascript中的一個(gè)函數(shù)被當(dāng)做構(gòu)造器使用)。

  在第3節(jié)我們說過每個(gè)函數(shù)的prototype對象中總是含有一個(gè)constructor屬性,這個(gè)屬性就是連接到我們的這個(gè)函數(shù)本身。再加之,有這個(gè)函數(shù)生成的每個(gè)對象的[[proto]]屬性都是指向構(gòu)造器函數(shù)的prototype對象,所以通過[[proto]]鏈,每個(gè)由構(gòu)造器函數(shù)生成的對象,都有一個(gè)constructor屬性,指向生成他的構(gòu)造器函數(shù),因此我們可以通過這個(gè)屬性來判斷這個(gè)對象是有哪個(gè)構(gòu)造器函數(shù)生成的。

  5、 函數(shù)繼承(類繼承)

  說了這么多,終于到了我們可以在javascript中討論繼承的時(shí)候了,我們先來考慮一下要實(shí)現(xiàn)類的繼承我們都要做些什么,假設(shè)我們要從superClass繼承到子類subClass

  為了使得由subClass生成的對象中能夠訪問superClass生成的對象中的屬性,那么可以使subClass.prototype為一個(gè)superClass構(gòu)造函數(shù)生成的對象。

  subclass.prototye = new superClass();

  但是問題來了,根據(jù)我們在第4節(jié)說的new superClass()不僅復(fù)制了superClass.prototype中的所有方法,而且還運(yùn)行了superClass()這個(gè)函數(shù),這個(gè)函數(shù)起到的作用是類中的構(gòu)造函數(shù)。我們知道應(yīng)該在子類的構(gòu)造函數(shù)中調(diào)用父類的構(gòu)造函數(shù)來實(shí)現(xiàn)初始化。為此我們可以創(chuàng)建一個(gè)構(gòu)造函數(shù)為空的,但是原型和superClass原型一致的函數(shù),并使subClass.prototype指向這個(gè)函數(shù)生成的對象。

  var F = function() {};

  F.prototype = superClass.prototype;

  subClass.protptype = new F();

  這樣我們就可以再不調(diào)用構(gòu)造函數(shù)的同時(shí)完成屬性復(fù)制的工作。但是還有一個(gè)問題,那就是我們修改了subClass的prototype屬性,從而也就刪除了其中的constructor屬性,這樣我們就無法知道他是哪個(gè)構(gòu)造器函數(shù)生成的對象了。我們可以再次給他賦值

  subClass.prototype.constructor = subClass;

  這樣復(fù)制屬性的問題就迎刃而解了。但是新的問題又出現(xiàn)了,在subClass中我們無法知道他的父類是哪個(gè)構(gòu)造器函數(shù),所以就無法在構(gòu)造函數(shù)中調(diào)用父類的構(gòu)造函數(shù),為此我們可以為subClass添加一個(gè)屬性,指明他的父類

  subClass.superClass = superClass.prototype;

  這樣我么就可以在子類的構(gòu)造函數(shù)中使用subClass.superClass.constructor來訪問父類的構(gòu)造函數(shù)了。最后我們把以上的思路寫成一個(gè)函數(shù)

  myPro.extend = function (subClass,superClass) {

  var F = function() {};

  F.prototype = superClass.prototype;

  subClass.protptype = new F();

  subClass.prototype.constructor = subClass;

  subClass.superClass = superClass.prototype;

  superClass.prototype.constructor = superClass;

  }



分享聯(lián)系我們

掃二維碼與項(xiàng)目經(jīng)理溝通 我們在微信上24小時(shí)期待你的聲音

感謝您的關(guān)注分享“網(wǎng)站建設(shè)中常用javascript中的對象與函數(shù)和繼承”
煙寒網(wǎng)絡(luò)真誠為您服務(wù) ,點(diǎn)擊客服直接咨詢下單.

我們服務(wù)

南寧網(wǎng)絡(luò)公司南寧網(wǎng)站建設(shè)

網(wǎng)站建設(shè)

高端網(wǎng)站建設(shè)服務(wù)商、相信品牌力量、相信知名企業(yè);制作后收費(fèi)13014982176!

南寧微信小程序/微信公眾號

微信小程序/微信公眾號

微信小程序 背靠10億流量,不論用戶需求是什么,都能被開發(fā)使用 一點(diǎn)創(chuàng)意,就能在“社交圈”中脫穎而出。

南寧網(wǎng)站優(yōu)化/SEO

網(wǎng)站優(yōu)化/SEO

讓您的網(wǎng)站更靠近排名位置,讓客戶更容易找到您,seo優(yōu)化是一個(gè)漫長過程,整個(gè)網(wǎng)站營銷花最少的錢起最大的作用。

欄目分類

南寧網(wǎng)站建設(shè)
網(wǎng)站建設(shè)建設(shè)知識

熱點(diǎn)標(biāo)簽

網(wǎng)站建設(shè) 品牌設(shè)計(jì) 微信小程序 網(wǎng)站優(yōu)化 平面廣告設(shè)計(jì)知識 網(wǎng)站優(yōu)化技術(shù) 網(wǎng)站建站知識 網(wǎng)站模板分享 微信公眾號開發(fā) 小程序技術(shù) APP應(yīng)用

我們服務(wù)客戶


企業(yè)形象網(wǎng)站、個(gè)人博客、政府門戶網(wǎng)站、新聞傳媒網(wǎng)站最省錢、省時(shí)、省備案 建站快、效率高更多服務(wù)
廣西華崧集團(tuán)網(wǎng)站品牌設(shè)計(jì)

廣西華崧集團(tuán)網(wǎng)站品牌設(shè)計(jì)

廣西華崧林業(yè)發(fā)展集團(tuán)(以下簡稱華崧集團(tuán))組建于2017年8月,集團(tuán)總部位于廣西壯...

廣西大和平房地產(chǎn)有限公司

廣西大和平房地產(chǎn)有限公司

廣西鴻生源環(huán)?萍加邢薰

廣西鴻生源環(huán)?萍加邢薰