資源描述:
《JS對(duì)象與原型》由會(huì)員上傳分享,免費(fèi)在線閱讀,更多相關(guān)內(nèi)容在行業(yè)資料-天天文庫。
1、面向?qū)ο笤O(shè)計(jì)-->引用類型(functionstringnumberarraydate)----->Object---->對(duì)象原型----->函數(shù)表達(dá)式--->數(shù)據(jù)類型面向?qū)ο螅侯惡蛯?duì)象,通過類可以創(chuàng)建任意多個(gè)具有相同屬性和方法的對(duì)象。ECMA定義對(duì)象:無序?qū)傩缘募希鋵傩钥梢园局?、?duì)象或者函數(shù)。相當(dāng)于一組沒有特定順序的值,對(duì)象的每個(gè)屬性或方法都有一個(gè)名字,而每個(gè)名字映射到一個(gè)值。即:對(duì)象就是一組鍵值對(duì),其中值可以是數(shù)據(jù)或函數(shù)。每個(gè)對(duì)象都是基于一個(gè)引用類型創(chuàng)建的。Object是所有JS對(duì)象的基類protot
2、ype是對(duì)象的原型obj.constructor是創(chuàng)造該對(duì)象的構(gòu)造器一、創(chuàng)建自定義對(duì)象varperson=newObject();person.name="dujie";person.say=function(){alert(this.name)};字面量法:varperson={name:"dujie",say:function(){alert(this.name);}}二、對(duì)象屬性內(nèi)部采用的特性,描述了屬性的各種特征,這些特性是為了實(shí)現(xiàn)JavaScript引擎用的,在js中不能直接訪問,為了表示特性是內(nèi)部值,規(guī)
3、范把他們放在了兩對(duì)方括號(hào)里例如:[[Enumerable]]ECMAScript中有兩種屬性:數(shù)據(jù)屬性和訪問器屬性1.數(shù)據(jù)屬性:包含一個(gè)數(shù)據(jù)值的位置,行為(在這個(gè)位置可以讀取和寫入值)4個(gè)描述行為:@1.[[Configurable]]:表示能否通過delete刪除屬性從而重新定義屬性,能否修改屬性的特性或者能否把屬性修改為訪問器屬性。默認(rèn)值為true@2.[[Enumerable]]:表示能否通過for-in循環(huán)返回屬性,默認(rèn)為true@3.[[Writable]]:表示能否修改屬性的值默認(rèn)為true@4.[[V
4、alue]]:包含這個(gè)屬性的數(shù)據(jù)值。默認(rèn)為undefined,從這個(gè)位置讀取或?qū)懭氡4鎸傩缘闹刀x對(duì)象時(shí)varperson={name:"dujie"}[[Value]]特性將被設(shè)置為"dujie"若要修改屬性默認(rèn)的特性,必須使用ECMAScript5的Object.defineProperty()方法Object.defineProperty(obj,"屬性名",描述符對(duì)象)描述符對(duì)象的屬性必須是configurableenumerablewritablevalue例如:varperson={};Object.d
5、efineProperty(person,"name",{writable:false,屬性值不可以修改,變成只讀configurable:false不可從對(duì)象中刪除屬性deleteperson.name無效果value:"dujie"});alert(person.name)//dujieperson.name="jack";alert(person.name)//dujie注意:可以多次調(diào)用Object.defineProperty()方法修改同一屬性的特性,但是把configurable特性設(shè)置為false后
6、就會(huì)有限制,除writable之外的特性都會(huì)報(bào)錯(cuò)原型對(duì)象模仿類,實(shí)例化對(duì)象實(shí)例化對(duì)象流程:1.創(chuàng)建obj=newObject()2.將obj的內(nèi)部__proto__指向構(gòu)造函數(shù)A的prototype屬性,同時(shí)obj.constructor===A.prototype.constructor類的實(shí)例對(duì)象的constructor屬性永遠(yuǎn)指向構(gòu)造函數(shù)的prototype.constructor,構(gòu)造函數(shù)person原型對(duì)象person.prototype對(duì)象實(shí)例person1三者的關(guān)系:每個(gè)構(gòu)造函數(shù)都有一個(gè)原型對(duì)象,原型
7、對(duì)象都包含一個(gè)指向構(gòu)造函數(shù)的指針,而實(shí)例都包含一個(gè)指向原型對(duì)象的內(nèi)部指針。原型鏈:原型對(duì)象等于另一個(gè)類型的實(shí)例,將包含一個(gè)指向另一個(gè)原型的指針,相應(yīng)地另一個(gè)原型中也包含指向另一個(gè)構(gòu)造函數(shù)的指針,層層遞進(jìn),構(gòu)成了原型連在實(shí)例中無法訪問prototype屬性,可通過isPrototypeOf()方法來確定對(duì)象之間是否存在這種關(guān)系person.prototype.isPrototypeOf(person1)//返回true因?yàn)閜erson1內(nèi)部有一個(gè)指向person.prototype的指針,所以返回true如果實(shí)例中的
8、prototype指向調(diào)用isPrototypeOf()方法的對(duì)象(person.prototype),就返回trueECMAScript5增加方法:Object.getPrototypeOf()返回[[Prototype]]的值(對(duì)象原型)(IE9+Firefox3.5Safari5+Opera12+Chrome支持此方法)alert(Object.get