創(chuàng)建對(duì)象的方法有哪些?

1逃顶、工廠模式創(chuàng)建對(duì)象

    //外部創(chuàng)建
        // function Car(model,color){
        //  this.model = model;
        //  this.color = color;
        // }
        function factory(model,color){
            //內(nèi)部創(chuàng)建
            function Car(model,color){
                this.model = model;
                this.color = color;
            }
            var o = new Car(model,color);
            return o;
        }

使用工廠模式能夠創(chuàng)建一個(gè)包含所有信息的對(duì)象讨便,可以無數(shù)次的調(diào)用的這個(gè)函數(shù)。雖然其解決了創(chuàng)建多個(gè)相似對(duì)象的問題以政,但卻沒有解決對(duì)象識(shí)別的問題(即如何得知一個(gè)對(duì)象的類型)

2霸褒、構(gòu)造函數(shù)創(chuàng)建對(duì)象

    function Car(model,color){
            this.model = model;
            this.color = color;
            this.run = function(){
                console.log(this.model + "跑~");
            }
        }
        var c1 = new Car("x1","blue");
        var c2 = new Car("x2","red");
        c1.run();
        c2.run();
    console.log("構(gòu)造函數(shù)"+c1.run == c2.run);
    //false表示兩個(gè)不同的函數(shù)對(duì)象
  • 構(gòu)造函數(shù)創(chuàng)建對(duì)象缺點(diǎn):
    函數(shù)是對(duì)象,c1,c2是不同的兩個(gè)對(duì)象盈蛮,每次new都會(huì)創(chuàng)建一個(gè)對(duì)象废菱,并且每個(gè)方法都有在每個(gè)實(shí)例上重新創(chuàng)建一遍,占內(nèi)存占空間
  • 解決方法:原型方式創(chuàng)建對(duì)象

注意:構(gòu)造函數(shù)其實(shí)和普通的函數(shù)沒有太大的差別抖誉,唯一的不同在于調(diào)用方式的不同殊轴。

3、原型創(chuàng)建對(duì)象

        function Apple(name){
            this.name = name;
        }
        Apple.prototype.eat = function(){
            console.log(this.name + "被吃了");
        }
        var a1 = new Apple("紅蘋果");
        var a2 = new Apple("青蘋果");
        a1.eat();
        a2.eat();
        console.log("原型:"+a1.eat == a2.eat);
        //true兩個(gè)對(duì)象指向同一個(gè)內(nèi)存區(qū)域袒炉,省內(nèi)存

原型模式也不是沒有缺點(diǎn)旁理,首先,它省略了構(gòu)造函數(shù)傳遞初始化參數(shù)這一環(huán)節(jié)我磁,結(jié)果所有實(shí)例在默認(rèn)情況下都取得了相同的屬性值孽文,這樣非常不方便驻襟,但這還是不是原型的最大問題,原型模式的最大問題在于共享的本性所導(dǎo)致的芋哭,由于共享沉衣,因此因此一個(gè)實(shí)例修改了引用,另一個(gè)也隨之更改了引用减牺。因此我們通常不單獨(dú)使用原型豌习,而是結(jié)合原型模式與構(gòu)造函數(shù)模式。

4拔疚、工廠模式+字面量創(chuàng)建對(duì)象

    //var obj = {} 等同于 var obj1 = new Object();
    function ObjectFactory(m,s){
        var o = new Object();
        o.model = m;
        o.size = s;
        return o;
    }
    var c1 = ObjectFactory("t420",14);
    var c2 = ObjectFactory("M920",15);
    var c3 = ObjectFactory("G520",10);
    var c4 = ObjectFactory("K496",13);
    console.log(c1 == c2);//false

5斑鸦、混合模式(原型模式 + 構(gòu)造函數(shù)模式)

function Blog(name, url, friend) {
  this.name = name;
  this.url = url;
  this.friend = friend;
}
Blog.prototype.alertInfo = function() {
  alert(this.name + this.url + this.friend);
}
var blog = new Blog('wuyuchang', 'http://tools.jb51.net/', ['fr1', 'fr2', 'fr3']);
var blog2 = new Blog('wyc', 'http://**.com', ['a', 'b']);
blog.friend.pop();
blog.alertInfo();  
// wuyuchanghttp://tools.jb51.net/fr1,fr2
blog2.alertInfo(); 
// wychttp://**.coma,b

混合模式中構(gòu)造函數(shù)模式用于定義實(shí)例屬性,而原型模式用于定義方法和共享屬性草雕。每個(gè)實(shí)例都會(huì)有自己的一份實(shí)例屬性,但同時(shí)又共享著方法固以,最大限度的節(jié)省了內(nèi)存墩虹。另外這種模式還支持傳遞初始參數(shù)。優(yōu)點(diǎn)甚多憨琳。這種模式在ECMAScript中是使用最廣泛诫钓、認(rèn)同度最高的一種創(chuàng)建自定義對(duì)象的方法。

6篙螟、動(dòng)態(tài)原型模式

function Blog(name, url) {
  this.name = name;
  this.url = url;
  if (typeof this.alertInfo != 'function') {
    // 這段代碼只執(zhí)行了一次
    alert('exe time');
    Blog.prototype.alertInfo = function() {
      alert(thia.name + this.url);
    }
  }
}
var blog = new Blog('wuyuchang', 'http://tools.jb51.net');
var blog2 = new Blog('wyc', 'http:***.com');

動(dòng)態(tài)原型模式將所有信息封裝在了構(gòu)造函數(shù)中菌湃,而通過構(gòu)造函數(shù)中初始化原型(僅第一個(gè)對(duì)象實(shí)例化時(shí)初始化原型),這個(gè)可以通過判斷該方法是否有效而選擇是否需要初始化原型遍略【逅可以看到上面的例子中只彈出一次窗,'exe time',即當(dāng)blog初始化時(shí),這樣做blog2就不在需要初始化原型翎碑,對(duì)于使用這種模式創(chuàng)建對(duì)象呈野,可以算是perfect了。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末咳促,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌履因,老刑警劉巖,帶你破解...
    沈念sama閱讀 221,635評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件盹愚,死亡現(xiàn)場離奇詭異栅迄,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)杯拐,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,543評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門霞篡,熙熙樓的掌柜王于貴愁眉苦臉地迎上來世蔗,“玉大人,你說我怎么就攤上這事朗兵∥哿埽” “怎么了?”我有些...
    開封第一講書人閱讀 168,083評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵余掖,是天一觀的道長寸爆。 經(jīng)常有香客問我,道長盐欺,這世上最難降的妖魔是什么赁豆? 我笑而不...
    開封第一講書人閱讀 59,640評(píng)論 1 296
  • 正文 為了忘掉前任,我火速辦了婚禮冗美,結(jié)果婚禮上魔种,老公的妹妹穿的比我還像新娘。我一直安慰自己粉洼,他們只是感情好节预,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,640評(píng)論 6 397
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著属韧,像睡著了一般安拟。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上宵喂,一...
    開封第一講書人閱讀 52,262評(píng)論 1 308
  • 那天糠赦,我揣著相機(jī)與錄音,去河邊找鬼锅棕。 笑死拙泽,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的裸燎。 我是一名探鬼主播奔滑,決...
    沈念sama閱讀 40,833評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢(mèng)啊……” “哼顺少!你這毒婦竟也來了朋其?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,736評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤脆炎,失蹤者是張志新(化名)和其女友劉穎梅猿,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體秒裕,經(jīng)...
    沈念sama閱讀 46,280評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡袱蚓,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,369評(píng)論 3 340
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了几蜻。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片喇潘。...
    茶點(diǎn)故事閱讀 40,503評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡体斩,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出颖低,到底是詐尸還是另有隱情絮吵,我是刑警寧澤,帶...
    沈念sama閱讀 36,185評(píng)論 5 350
  • 正文 年R本政府宣布忱屑,位于F島的核電站蹬敲,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏莺戒。R本人自食惡果不足惜伴嗡,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,870評(píng)論 3 333
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望从铲。 院中可真熱鬧瘪校,春花似錦、人聲如沸名段。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,340評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽吉嫩。三九已至,卻和暖如春嗅定,著一層夾襖步出監(jiān)牢的瞬間自娩,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,460評(píng)論 1 272
  • 我被黑心中介騙來泰國打工渠退, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留忙迁,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,909評(píng)論 3 376
  • 正文 我出身青樓碎乃,卻偏偏與公主長得像姊扔,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子梅誓,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,512評(píng)論 2 359

推薦閱讀更多精彩內(nèi)容