面向?qū)ο?2-對象的創(chuàng)建

對象的創(chuàng)建

  • 字面量
  • 內(nèi)置構(gòu)造函數(shù)(Object)
  • 工廠函數(shù)
  • 自定義構(gòu)造函數(shù)
  • Object.create()

01 字面量方式創(chuàng)建對象

代碼示例

var  book1 = {
        name:"聲名狼藉者的生活",
        price:42.00,
        author:"刚海柯",
        press:"北京大學(xué)出版社",
        read:function () {
            console.log("我的書名為:聲名狼藉者的的生活,作者為福柯....");
        }
    };

存在問題

  • 代碼復(fù)用性差
  • 如果要創(chuàng)建大量的同類型對象拄踪,則需要些大量重復(fù)性代碼

02 內(nèi)置構(gòu)造函數(shù)創(chuàng)建對象

  • 內(nèi)置構(gòu)造函數(shù)

    • String Number Boolean 注意:(區(qū)別于string number boolean)
    • Date Array Function Object RegExp....

代碼示例

    var book1 = new Object();
    book1.name = "聲名狼藉者的生活";
    book1.price = 42.00;
    book1.author = "福柯";
    book1.press = "北京大學(xué)出版社";
    book1.read = function () {
        console.log("我的書名為:聲名狼藉者的的生活,作者為福柯....");
    };

問題

01 創(chuàng)建的對象無法復(fù)用,復(fù)用性差

02 如果需要創(chuàng)建多個(gè)同類型的對象,如(書籍)則需要寫大量重復(fù)的代碼,代碼的冗余度高


03 簡單工廠函數(shù)創(chuàng)建對象

代碼示例

    function createBookNew (name,price,author,press) {

        var book = new Object();
        book.name = name;
        book.price = price;
        book.author = author;
        book.press = press;
        book.read = function () {
            console.log("我的書名為:"+book.name+",作者為"+book.author+"....");
        };

        return book;
    }

    //使用工廠函數(shù)來創(chuàng)建對象
    var book1 = createBookNew("聲名狼藉者的的生活","42.00","福柯","北京大學(xué)出版社");
    var book2 = createBookNew("人性的枷鎖","49.00","毛姆","華東師范大學(xué)出版社");
    var book3 = createBookNew("悟空傳","28.00","今何在","湖南文藝出版社");

    //打印對象的屬性,調(diào)用對象的方法
    console.log(book1.name);
    console.log(book2.name);
    console.log(book3.name);

    book1.read();
    book2.read();
    book3.read();

工廠函數(shù)創(chuàng)建對象說明
工廠函數(shù)方法其本質(zhì)就是對內(nèi)置構(gòu)造函數(shù)創(chuàng)建對象的一個(gè)封裝俐东,適用于大批量創(chuàng)建同種類型的對象

    function createBook (name,price,author,press) {

        //001 參數(shù) = 原料
        var book = new Object();

        //002 創(chuàng)建對象并設(shè)置對象的屬性和方法 = 對原料進(jìn)行加工
        book.name = name;
        book.price = price;
        book.author = author;
        book.press = press;
        book.read = function () {
            console.log("我的書名為:"+book.name+",作者為"+book.author+"....");
        };

        //003 把處理好的對象返回給我們 == 產(chǎn)品出廠
        return book;
    }

封裝思路

使用函數(shù)把固定不變的部分封裝起來,變化的部分提取為函數(shù)的參數(shù)

工廠函數(shù)創(chuàng)建對象的實(shí)現(xiàn)過程

① 提供一個(gè)創(chuàng)建對象的函數(shù)(參數(shù))

② 在該函數(shù)內(nèi)部使用new 關(guān)鍵字和Object構(gòu)造器創(chuàng)建對象

③ 設(shè)置對象的屬性

④ 設(shè)置對象的方法

⑤ 返回對象


04 自定義構(gòu)造函數(shù)創(chuàng)建對象

構(gòu)造函數(shù)與普通函數(shù)的區(qū)別:

  • 本質(zhì)上沒有區(qū)別
  • 構(gòu)造函數(shù)一般首字母大寫
  • 調(diào)用的時(shí)候订晌,構(gòu)造函數(shù)一般與new結(jié)合使用創(chuàng)建對象

核心過程:

01 提供一個(gè)(構(gòu)造)函數(shù)

02 在函數(shù)通過this設(shè)置屬性和方法

03 通過new 函數(shù)()創(chuàng)建對象

  • 內(nèi)部實(shí)現(xiàn)具體過程

    • 默認(rèn)在函數(shù)內(nèi)部創(chuàng)建一個(gè)空對象 var o=new Object()
    • 將創(chuàng)建的新對象賦值給this this=o
    • 默認(rèn)會把新創(chuàng)建的對象的原型對象設(shè)為當(dāng)前構(gòu)造函數(shù)的原型對象 o.proto=Person.prototype
    • 默認(rèn)會設(shè)置新創(chuàng)建對象的構(gòu)造器屬性為當(dāng)前構(gòu)造函數(shù) o.proto.constructor=Person
    • 通過this設(shè)置屬性和方法
    • 默認(rèn)會把新創(chuàng)建的對象返回 return o

代碼示例

    function CreateBook (name,price,author,press) {
        this.name = name;
        this.price = price;
        this.author = author;
        this.press = press;
        this.read = function () {
            console.log("我的書名為:"+this.name+",作者為"+this.author+"....");
        };
    }

    var b1 = new CreateBook("聲名狼藉者的的生活","42.00","嘎脖瑁柯","北京大學(xué)出版社");
    var b2 = new CreateBook("人性的枷鎖","49.00","毛姆","華東師范大學(xué)出版社");
    var b3 = new CreateBook("悟空傳","28.00","今何在","湖南文藝出版社");

    //打印對象的屬性,并調(diào)用對象的方法測試
    console.log(b1.author);
    console.log(b2.author);
    console.log(b3.author);
    b1.read();
    b2.read();
    b3.read();
    console.log(b1 == b2); // false,創(chuàng)建的對象為引用類型锈拨,存儲的是地址砌庄,兩次創(chuàng)建對象,存儲的地址不同奕枢,自然不相等
    console.log(b1.read == b2.read); //false娄昆,同上
    

構(gòu)造函數(shù)的返回值

01 如果在構(gòu)造函數(shù)中沒有顯示的return,則默認(rèn)返回的是新創(chuàng)建出來的對象

02 如果在構(gòu)造函數(shù)中顯示的return,則依照具體的情況處理

[01] return 的是對象,則直接返回該對象,取而代之本該默認(rèn) 返回的新對象
[02] return 的是null或基本數(shù)據(jù)類型值,則返回新創(chuàng)建的對象

構(gòu)造函數(shù)方式創(chuàng)建對象存在的問題

每次創(chuàng)建對象,都會重新創(chuàng)建函數(shù),那么如果創(chuàng)建的對象數(shù)量很多,而對象方法內(nèi)部的實(shí)現(xiàn)一模一樣,則造成了資源浪費(fèi)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末缝彬,一起剝皮案震驚了整個(gè)濱河市萌焰,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌谷浅,老刑警劉巖杆怕,帶你破解...
    沈念sama閱讀 216,544評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異壳贪,居然都是意外死亡陵珍,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,430評論 3 392
  • 文/潘曉璐 我一進(jìn)店門违施,熙熙樓的掌柜王于貴愁眉苦臉地迎上來互纯,“玉大人,你說我怎么就攤上這事磕蒲×袅剩” “怎么了只盹?”我有些...
    開封第一講書人閱讀 162,764評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長兔院。 經(jīng)常有香客問我殖卑,道長,這世上最難降的妖魔是什么坊萝? 我笑而不...
    開封第一講書人閱讀 58,193評論 1 292
  • 正文 為了忘掉前任孵稽,我火速辦了婚禮,結(jié)果婚禮上十偶,老公的妹妹穿的比我還像新娘菩鲜。我一直安慰自己,他們只是感情好惦积,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,216評論 6 388
  • 文/花漫 我一把揭開白布接校。 她就那樣靜靜地躺著,像睡著了一般狮崩。 火紅的嫁衣襯著肌膚如雪蛛勉。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,182評論 1 299
  • 那天睦柴,我揣著相機(jī)與錄音诽凌,去河邊找鬼。 笑死爱只,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的招刹。 我是一名探鬼主播恬试,決...
    沈念sama閱讀 40,063評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼疯暑!你這毒婦竟也來了训柴?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,917評論 0 274
  • 序言:老撾萬榮一對情侶失蹤妇拯,失蹤者是張志新(化名)和其女友劉穎幻馁,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體越锈,經(jīng)...
    沈念sama閱讀 45,329評論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡仗嗦,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,543評論 2 332
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了甘凭。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片稀拐。...
    茶點(diǎn)故事閱讀 39,722評論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖丹弱,靈堂內(nèi)的尸體忽然破棺而出德撬,到底是詐尸還是另有隱情铲咨,我是刑警寧澤,帶...
    沈念sama閱讀 35,425評論 5 343
  • 正文 年R本政府宣布蜓洪,位于F島的核電站纤勒,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏隆檀。R本人自食惡果不足惜摇天,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,019評論 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望刚操。 院中可真熱鬧闸翅,春花似錦、人聲如沸菊霜。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,671評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽鉴逞。三九已至记某,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間构捡,已是汗流浹背液南。 一陣腳步聲響...
    開封第一講書人閱讀 32,825評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留勾徽,地道東北人滑凉。 一個(gè)月前我還...
    沈念sama閱讀 47,729評論 2 368
  • 正文 我出身青樓,卻偏偏與公主長得像喘帚,于是被迫代替她去往敵國和親畅姊。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,614評論 2 353

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

  • 博客內(nèi)容:什么是面向?qū)ο鬄槭裁匆嫦驅(qū)ο竺嫦驅(qū)ο缶幊痰奶匦院驮瓌t理解對象屬性創(chuàng)建對象繼承 什么是面向?qū)ο?面向?qū)ο?..
    _Dot912閱讀 1,421評論 3 12
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理吹由,服務(wù)發(fā)現(xiàn)若未,斷路器,智...
    卡卡羅2017閱讀 134,652評論 18 139
  • 第5章 引用類型(返回首頁) 本章內(nèi)容 使用對象 創(chuàng)建并操作數(shù)組 理解基本的JavaScript類型 使用基本類型...
    大學(xué)一百閱讀 3,233評論 0 4
  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語法倾鲫,類相關(guān)的語法粗合,內(nèi)部類的語法,繼承相關(guān)的語法乌昔,異常的語法隙疚,線程的語...
    子非魚_t_閱讀 31,623評論 18 399
  • 前兩天我還在喜劇里說,我所立的地方磕道,那就是我的生活了甚淡。 生活什么的太平淡,對于像我這樣風(fēng)騷的,我要好好拔高一下贯卦,那...
    ly12386閱讀 273評論 1 1