摘要:面向?qū)ο蟮娜筇匦苑庋b繼承自己沒有的,拿別人過來用,就是繼承多態(tài)父類引用指向子類的對象中用不到創(chuàng)建對象的四種方式使用字面量創(chuàng)建對象用一個創(chuàng)建一個,不能復(fù)用,造成代碼冗余,資源浪費使用內(nèi)置構(gòu)造函數(shù)創(chuàng)建對象創(chuàng)建出來的對象都是空的對象,要手動的去
1.面向?qū)ο蟮娜筇匦?/b>
封裝
繼承
自己沒有的,拿別人過來用,就是繼承
多態(tài)
父類引用指向子類的對象(JavaScript中用不到)
使用字面量創(chuàng)建對象
var o = {key:value, key:value...}
用一個創(chuàng)建一個,不能復(fù)用,造成代碼冗余,資源浪費
使用內(nèi)置構(gòu)造函數(shù)創(chuàng)建對象
var o = new Object(); var o = new Array();
創(chuàng)建出來的對象都是空的對象,要手動的去為對象添加屬性。造成代碼重復(fù)
封裝簡單的工廠函數(shù)(不推薦使用)
function createObj(){ var obj = {}; obj.xx=xxx; return obj; }
自定義構(gòu)造函數(shù)
function 構(gòu)造函數(shù)名{ this.xxx=xxx; //.... }
1.構(gòu)造函數(shù)名首字母要大寫
2.構(gòu)造函數(shù)一般和new關(guān)鍵字一起使用
3.構(gòu)造函數(shù)返回值默認(rèn)為新創(chuàng)建好對象 如果手動返回基本數(shù)據(jù)類型,不影響默認(rèn)返回值,如果返回的是對象,那么新創(chuàng)建出來的對象將不會返回,取而代之的是return后面的對象
構(gòu)造函數(shù)(constructor)的執(zhí)行步驟
1.使用new關(guān)鍵字創(chuàng)建對象
2.調(diào)用構(gòu)造函數(shù),將new創(chuàng)建出來的對象賦值給構(gòu)造函數(shù)內(nèi)的this
3.使用this給新創(chuàng)建出來的對象增加成員
4.默認(rèn)返回新創(chuàng)建出來的這個對象
構(gòu)造函數(shù)中的方法,每新創(chuàng)建一個對象的時候,該對象都會重新的創(chuàng)建一次這個方法,每個獨享獨占一個方法
但是該方法內(nèi)容完全相同,所以造成資源浪費
1.解決辦法1
將構(gòu)造函數(shù)內(nèi)的方法,進(jìn)行提取,放在構(gòu)造函數(shù)外面,在構(gòu)造函數(shù)內(nèi)部進(jìn)行引用賦值
那么創(chuàng)建出來的對象,都會指向構(gòu)造函數(shù)外面的這個函數(shù),達(dá)到共享的目的
問題:全局變量增多,造成全局變量污染,代碼結(jié)構(gòu)混亂,不容易維護(hù)
2.解決辦法2
使用原型
在構(gòu)造函數(shù)創(chuàng)建出來的時候,系統(tǒng)會默認(rèn)的創(chuàng)建并關(guān)聯(lián)一個對象,這個對象就是原型,原型對象默認(rèn)是空對象
默認(rèn)的原型對象中會有一個屬性constructor指向該構(gòu)造函數(shù)
原型對象中的成員,可以被使用和它關(guān)聯(lián)的構(gòu)造函數(shù)創(chuàng)建出來的所有對象共享
原型對象的使用使用對象的動態(tài)特性,為原型對象添加成員
直接替換原型對象
注意事項:
直接替換原型對象,會導(dǎo)致替換之前創(chuàng)建的對象的原型和替換之后創(chuàng)建的對象的原型不一致原型的使用該注意事項
1.使用對象訪問屬性的時候,會現(xiàn)在對象中查找,如果找到了就直接使用
如果沒有找到,就去原型中查找
2.使用對象設(shè)置屬性的時候,只會在對象本身中查找,不會去原型中查找,如果在對象本身中沒有找到這個屬性
則給該對象新增一個屬性,如果在對象中有這個屬性,修改這個屬性
3.如果在原型對象中有引用類型的屬性,那么使用對象進(jìn)行修改該屬性內(nèi)容,則其他所有跟這個原型對象相關(guān)的對象都會受到影響
Person.prototype.car = {}; var p = new Person( ); p.car = {}; //這是修改屬性 p.car.brand= ""; //這是修改屬性的內(nèi)容
4.一般情況下不會將屬性添加到原型對象中
只會將需要共享的方法,添加到原型對象中
1.這個屬性不是標(biāo)準(zhǔn)屬性,所以存在通用性問題
2.一般不推薦使用這個屬性
3.調(diào)試的時候,可以使用這個屬性
4.這個屬性是原型中的屬性
替換原型時候的注意事項:
在新替換的原型中,沒有constructor屬性,會影響三角結(jié)構(gòu)關(guān)系的合理性
so,在新替換的原型中,手動添加constructor屬性,以保證關(guān)系的合理性,賦值為關(guān)聯(lián)的構(gòu)造函數(shù)
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/94078.html
摘要:面向?qū)ο蟮娜筇匦苑庋b繼承自己沒有的,拿別人過來用,就是繼承多態(tài)父類引用指向子類的對象中用不到創(chuàng)建對象的四種方式使用字面量創(chuàng)建對象用一個創(chuàng)建一個,不能復(fù)用,造成代碼冗余,資源浪費使用內(nèi)置構(gòu)造函數(shù)創(chuàng)建對象創(chuàng)建出來的對象都是空的對象,要手動的去 1.面向?qū)ο蟮娜筇匦? 封裝 繼承自己沒有的,拿別人過來用,就是繼承 多態(tài)父類引用指向子類的對象(JavaScript中用不到) 2.創(chuàng)建對象...
摘要:創(chuàng)建對象對象繼承實際上是一回事我們所需要的實例對象通過構(gòu)造函數(shù)獲得私有屬性通過原型鏈獲得共享的屬性。原型式繼承和寄生式繼承用于創(chuàng)建與已有對象類似的實例對象。 本文約定:不特殊聲明的情況下,屬性代指屬性或方法。 創(chuàng)建對象、對象繼承實際上是一回事:我們所需要的實例對象通過構(gòu)造函數(shù)獲得私有屬性、通過原型鏈獲得共享的屬性。什么是好的方式?私有屬性通過構(gòu)造函數(shù)的方式獲得(不考慮實例中自定義私有屬...
摘要:繼承方式父類構(gòu)造函數(shù)實例方法子類調(diào)用實現(xiàn)父類的構(gòu)造函數(shù)吹呀吹呀,我的驕傲放縱 js構(gòu)造函數(shù) *前言:上篇文章介紹了js中通過構(gòu)造函數(shù)來實例化對象的各種方法js構(gòu)造函數(shù),這篇文章主要介紹構(gòu)造函數(shù)的繼承(類的繼承),同樣包括 ES5 和 ES6 兩部分的介紹,能力所限,文中難免有不合理或錯誤的地方,還望各位大神批評指正~ 原型 首先簡單介紹一下實例屬性/方法 和 原型屬性/方法,以便更好理...
摘要:執(zhí)行行代碼,我們可以看到控制臺打印出來的結(jié)果如下結(jié)果印證了我們上面講的內(nèi)容指向的構(gòu)造函數(shù)指向的原型對象原型對象中指向構(gòu)造函數(shù)。 在javascript中原型和原型鏈機制是最難懂的部分(沒有之一),同時也是最重要的部分,在學(xué)習(xí)的過程中你可能認(rèn)認(rèn)真真的看了一遍但還是完全不懂書上說的什么,的確是這樣的,我在學(xué)習(xí)的時候可是反復(fù)看了4、5遍才初步理解了。 下面我把我的理解總結(jié)了一下希望對你們有...
摘要:在創(chuàng)建子類實例時,不能向超類型的構(gòu)造函數(shù)中傳遞參數(shù)。構(gòu)造函數(shù)繼承子類傳進(jìn)的值是基本思想是在子類構(gòu)造函數(shù)的內(nèi)部調(diào)用超類或父類型構(gòu)造函數(shù)。繼承保證構(gòu)造函數(shù)指針指向如果想同時繼承多個,還可使用添加屬性的方式類繼承, OOP:Object Oriented Programming 面向?qū)ο缶幊獭?題外話:面向?qū)ο蟮姆秶鷮嵲谔?,先把這些大的東西理解理解。 1.什么是對象? 根據(jù)高程和權(quán)威指南上...
閱讀 2838·2021-11-25 09:43
閱讀 986·2021-10-11 10:57
閱讀 2491·2020-12-03 17:20
閱讀 3735·2019-08-30 14:05
閱讀 2430·2019-08-29 14:00
閱讀 2000·2019-08-29 12:37
閱讀 1672·2019-08-26 11:34
閱讀 3217·2019-08-26 10:27