摘要:概括創(chuàng)建自定義類(lèi)型的最常見(jiàn)方式,就是組合使用構(gòu)造函數(shù)模式與原型模式。應(yīng)用方式一分開(kāi)定義,用來(lái)理解構(gòu)造函數(shù)與原型方式二動(dòng)態(tài)原型模式定義,避免獨(dú)立的構(gòu)造函數(shù)和原型,更完美的定義形式。
概括:創(chuàng)建自定義類(lèi)型的最常見(jiàn)方式,就是組合使用構(gòu)造函數(shù)模式與原型模式。
好處:通過(guò)這種方式,不僅每個(gè)實(shí)例都有自己的一份實(shí)例屬性的副本,而且同時(shí)又共享著對(duì)方法的引用,最大限度的節(jié)省了內(nèi)存。而且這種混合模式還支持向構(gòu)造函數(shù)傳遞參數(shù),可謂是集兩種模式之長(zhǎng)。
定義形式:有兩種定義方式,方式-:分開(kāi)定義(這樣更好理解構(gòu)造函數(shù)和原型),方式二:動(dòng)態(tài)定義(把所有信息都封裝在了構(gòu)造函數(shù)中,通過(guò)在構(gòu)造函數(shù)中初始化原型,又保持了同時(shí)使用構(gòu)造函數(shù)和原型的有點(diǎn),換句話說(shuō),可以通過(guò)檢查某個(gè)應(yīng)該存在的方法是否有效,來(lái)決定是否需要初始化原型)。
應(yīng)用:
方式一:分開(kāi)定義,用來(lái)理解構(gòu)造函數(shù)與原型
function Person(name,age,job){ this.name=name; this.age=age; this.job=job; this.friends=["Sandy","Court"]; } Person.prototype={ constructor:Person, sayName:function(){ alert(this.name); } }
方式二:動(dòng)態(tài)原型模式定義,避免獨(dú)立的構(gòu)造函數(shù)和原型,更完美的定義形式。
function Person(name,age,job){ this.name=name; this.age=age; this.job=job; this.friends=["xiaohonghua","xiaohuanghua"]; if(typeof this.sayName!="function"){ Person.prototype.sayName=function(){ alert(this.name); }; } }
這里的sayName()方法不存在的情況下,才會(huì)將它添加到原型中。這段代碼只會(huì)在初次調(diào)用構(gòu)造函數(shù)時(shí)才會(huì)執(zhí)行,此后,原型已經(jīng)完成初始化,不需要在做什么修改了。不過(guò)如果修改,會(huì)立即在所有實(shí)例中得到反映。
調(diào)用:
因?yàn)閟ayName()方法是原型方法,所以是Person實(shí)例的所有共享方法,而構(gòu)造函數(shù)中定義的各種屬性是各個(gè)實(shí)例的屬性,隨意更改,不影響其他實(shí)例。
function test(){ var person1=new Person1("xiaohong",26,"Teacher"); var person2=new Person1("xiaoming",27,"Soft Engineer"); person1.friends.push("Van"); alert(person1.friends); //xiaohonghua,xiaohuanghua,Van alert(person2.friends); //xiaohonghua,xiaohuanghua alert(person1.friends == person2.friends); //false alert(person2.sayName == person2.sayName); //true person1.sayName(); //xiaohong }
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/85722.html
摘要:目錄導(dǎo)語(yǔ)理解對(duì)象和面向?qū)ο蟮某绦蛟O(shè)計(jì)創(chuàng)建對(duì)象的方式的繼承機(jī)制原型對(duì)象原型鏈與原型對(duì)象相關(guān)的方法小結(jié)導(dǎo)語(yǔ)前面的系列文章,基本把的核心知識(shí)點(diǎn)的基本語(yǔ)法標(biāo)準(zhǔn)庫(kù)等章節(jié)講解完本章開(kāi)始進(jìn)入核心知識(shí)點(diǎn)的高級(jí)部分面向?qū)ο蟮某绦蛟O(shè)計(jì),這一部分的內(nèi)容將會(huì)對(duì)對(duì)象 目錄 導(dǎo)語(yǔ) 1.理解對(duì)象和面向?qū)ο蟮某绦蛟O(shè)計(jì) 2.創(chuàng)建對(duì)象的方式 3.JavaScript的繼承機(jī)制 3.1 原型對(duì)象 3.2 原型鏈 3.3 與...
摘要:基本概念面向?qū)ο缶幊淌怯贸橄蠓绞絼?chuàng)建基于現(xiàn)實(shí)世界模型的一種編程模式。使用面向?qū)ο缶幊淌菫榱舜龠M(jìn)更好的靈活性和可維護(hù)性。面向?qū)ο笈c面向過(guò)程比較,面向過(guò)程更注重過(guò)程。 1:基本概念 面向?qū)ο缶幊淌怯贸橄蠓绞絼?chuàng)建基于現(xiàn)實(shí)世界模型的一種編程模式。 這句話的意思是:每個(gè)對(duì)象能夠接受信息,處理數(shù)據(jù)和發(fā)送消息給其他對(duì)象;這就意味著在這個(gè)編程模式下,每一個(gè)對(duì)象都是一個(gè)獨(dú)立的個(gè)體,它可以接收,可以處理,...
摘要:組合構(gòu)造函數(shù)原型模式解決構(gòu)造傳參和共享問(wèn)題,可以組合構(gòu)造函數(shù)原型模式不共享的使用構(gòu)造函數(shù)共享的使用原型模式強(qiáng)制指向這種模式也是最常見(jiàn)也是最常用的模式,這種混合模式很好的解決了傳參和引用共享的大難題。 寫(xiě)在前面: 之前的文章都是寫(xiě)構(gòu)造函數(shù),原型之類(lèi)的。但是我們都知道原型最大的優(yōu)點(diǎn)也是缺點(diǎn)就是共享。也是我們最頭疼的問(wèn)題.據(jù)共享的緣故,導(dǎo)致很多開(kāi)發(fā)者放棄使用原型,因?yàn)槊看螌?shí)例化出的數(shù)據(jù)需要保...
摘要:不必在構(gòu)造函數(shù)中定義對(duì)象實(shí)例的信息。其次,按照一切事物皆對(duì)象的這餓極本的面向?qū)ο蟮姆▌t來(lái)說(shuō),類(lèi)本身并不是一個(gè)對(duì)象,然而原型方式的構(gòu)造函數(shù)和原型本身也是個(gè)對(duì)象。第二個(gè)問(wèn)題就是在創(chuàng)建子類(lèi)型的實(shí)例時(shí),不能向超類(lèi)型的構(gòu)造函數(shù)中傳遞參數(shù)。 前言 對(duì)象(Object)應(yīng)該算是js中最為重要的部分,也是js中非常難懂晦澀的一部分。更是面試以及框架設(shè)計(jì)中各出沒(méi)。寫(xiě)這篇文章,主要參考與JavaScrip...
摘要:一面向?qū)ο蟾拍蠲嫦驅(qū)ο缶褪鞘褂脤?duì)象。因此在構(gòu)造函數(shù)中表示剛剛創(chuàng)建出來(lái)的對(duì)象。在構(gòu)造函數(shù)中利用對(duì)象的動(dòng)態(tài)特性為其對(duì)象添加成員。 一、面向?qū)ο?1.1 概念 面向?qū)ο缶褪鞘褂脤?duì)象。面向?qū)ο箝_(kāi)發(fā)就是使用對(duì)象開(kāi)發(fā)。 面向過(guò)程就是用過(guò)程的方式進(jìn)行開(kāi)發(fā)。面向?qū)ο笫菍?duì)面向過(guò)程的封裝。 1.2 三大特性 抽象性所謂的抽象性就是:如果需要一個(gè)對(duì)象描述數(shù)據(jù),需要抽取這個(gè)對(duì)象的核心數(shù)據(jù) 提出需要的核心...
閱讀 2664·2019-08-30 15:53
閱讀 2880·2019-08-29 16:20
閱讀 1087·2019-08-29 15:10
閱讀 1028·2019-08-26 10:58
閱讀 2198·2019-08-26 10:49
閱讀 640·2019-08-26 10:21
閱讀 708·2019-08-23 18:30
閱讀 1640·2019-08-23 15:58