字面量方式及内置构造函数创建对象

创建对象的几种方式

    ① 字面量的方式创建对象(@)
    ② 内置构造函数的方式来创建对象
    ③ 简单工厂函数的方式来创建对象
    ④ 自定义构造函数的方式来创建对象
  • 字面量方式创建对象

基本写法

var  book1 = {
        name:"声名狼藉者的生活",
        price:42.00,
        author:"福柯",
        press:"北京大学出版社",
        read:function () {
            console.log("我的书名为:声名狼藉者的的生活,作者为福柯....");
        }
    };
  • ①字面量的方式来创建对象示例

<script>
    var  book1 = {
        name:"声名狼藉者的生活",
        price:42.00,
        author:"福柯",
        press:"北京大学出版社",
        read:function () {
            console.log("我的书名为:声名狼藉者的的生活,作者为福柯....");
        }
    };


    var  book2 = {
        name:"人性的枷锁",
        price:49.00,
        author:"毛姆",
        press:"华东师范大学出版社",
        read:function () {
            console.log("我的书名为:华东师范大学出版社,作者为毛姆....");
        }
    };


    var  book3 = {
        name:"悟空传",
        price:28.00,
        author:"今何在",
        press:"湖南文艺出版社",
        read:function () {
            console.log("我的书名为:悟空传,作者为今何在....");
        }
    };


    //02 打印对象的属性,调用对象的方法
    console.log(book1.name);
    console.log(book1.author);
    console.log(book1.price);
    console.log(book1.press);
    book1.read();

    console.log("_______________");

    console.log(book2.name);
    console.log(book2.author);
    console.log(book2.price);
    console.log(book2.press);
    book2.read();

    console.log("_______________");

    console.log(book3.name);
    console.log(book3.author);
    console.log(book3.price);
    console.log(book3.press);
    book1.read();
  console.log("_______________");
</script>
 03 思考:以字面量的方式创建对象有哪些利弊?

存在的问题

[01] 代码复用性差
[02] 如果要创建大量的同类型对象,则需要些大量重复性代码

  • JS中有哪些内置构造函数
String
Number
Boolean
    注意:(区别于string number boolean)
Date
Array
Function
Object
RegExp

基本写法

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

问题

  • 1 创建的对象无法复用,复用性差

  • 02 如果需要创建多个同类型的对象,如(书籍)则需要写大量重复的代码,代码的冗余度高

  • ②内置构造函数的方式来创建对象

<script>
    //01 使用内置构造函数的方式来创建对象
    var book1 = new Object();
    book1.name = "声名狼藉者的生活";
    book1.price = 42.00;
    book1.author = "福柯";
    book1.press = "北京大学出版社";
    book1.read = function () {
        console.log("我的书名为:声名狼藉者的的生活,作者为福柯....");
    };


    var book2 = new Object();
    book2.name = "人性的枷锁";
    book2.price = 49.00;
    book2.author = "毛姆";
    book2.press = "华东师范大学出版社";
    book2.read = function () {
        console.log("我的书名为:人性的枷锁,作者为毛姆....");
    };

    var book3 = new Object();
    book3.name = "悟空传";
    book3.price = 28.00;
    book3.author = "今何在";
    book3.press = "湖南文艺出版社";
    book3.read = function () {
        console.log("我的书名为:悟空传,作者为今何在....");
    };

    //02 打印对象的属性,调用对象的方法
    console.log(book1.name);
    console.log(book1.author);
    console.log(book1.price);
    console.log(book1.press);
    book1.read();

    console.log("_______________");

    console.log(book2.name);
    console.log(book2.author);
    console.log(book2.price);
    console.log(book2.press);
    book2.read();

    console.log("_______________");

    console.log(book3.name);
    console.log(book3.author);
    console.log(book3.price);
    console.log(book3.press);
    book3.read();

    console.log("_______________");
思考:能够把创建同类型对象的过程封装起来,提高代码的复用性?
</script>

问题:使用内置构造函数的方式和字面量的方式来创建对象差不多,都存在以下问题:
01 创建的对象无法复用,复用性差
02 如果需要创建多个同类型的对象,如(书籍)则需要写大量重复的代码,代码的冗余度高

  • ③ 简单工厂函数的方式来创建对象

简单工厂函数的方式来创建对象 (本质就是对之前创建对象的过程进行封装)

<script>
    //01 封装创建对象的过程
    function createBook () {

        var book = new Object();
        book.name = "声名狼藉者的生活";
        book.price = 42.00;
        book.author = "福柯";
        book.press = "北京大学出版社";
        book.read = function () {
            console.log("我的书名为:声名狼藉者的的生活,作者为福柯....");
        };
        return book;
    }

    //02 使用封装好的工厂函数来创建对象
    var book1 = createBook();
    var book2 = createBook();

    //03 打印对象的属性并调用对象的方法
    console.log(book1.name);
    console.log(book2.name);
    book1.read();
    book2.read();

    console.log("_________________________");
    //04 说明:以上代码确实能够快速简单的创建出新的对象,但是创建出来的对象内部的属性和方法相同,这并不是我们想要的。

    //05 对上面的工厂函数进行改进
    //改进思路:封装不变的部分,提取变化的部分作为参数
    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;
    }
    //06 使用新的工厂函数来创建对象
    var book1 = createBookNew("声名狼藉者的的生活","42.00","福柯","北京大学出版社");
    var book2 = createBookNew("人性的枷锁","49.00","毛姆","华东师范大学出版社");
    var book3 = createBookNew("悟空传","28.00","今何在","湖南文艺出版社");

    //07 打印对象的属性,调用对象的方法
    console.log(book1.name);
    console.log(book2.name);
    console.log(book3.name);

    book1.read();
    book2.read();
    book3.read();
</script>

工厂函数说明

 工厂函数方式创建对象其本质是对内置构造函数创建对象的过程进行了封装

 适用于大规模“批量生产”同类型的对象
 function createBook (name,price,author,press) {

        //001 参数 = 原料
        var book = new Object();

        //002 创建对象并设置对象的属性和方法 = 对原料进行加工
        book.name = name;
        book.price = price;
        book.author = author;
        book.press = press;
        book.read = function () {
            console.log("我的书名为:"+book.name+",作者为"+book.author+"....");
        };

        //003 把处理好的对象返回给我们 == 产品出厂
        return book;
    }
  • 封装思路

  • 使用函数把固定不变的部分封装起来,变化的部分提取为函数的参数

  • 工厂函数创建对象的实现过程

    ① 提供一个创建对象的函数(参数)

    ② 在该函数内部使用new 关键字和Object构造器创建对象

    ③ 设置对象的属性

    ④ 设置对象的方法

    ⑤ 返回对象

  • ④ 自定义构造函数的方式来创建对象
<script>
    //00 回顾:简单工厂函数创建对象
    function createBook (name,price,author,press) {
        //001 参数 = 原料
        var book = new Object();

        //002 创建对象并设置对象的属性和方法 = 对原料进行加工
        book.name = name;
        book.price = price;
        book.author = author;
        book.press = press;
        book.read = function () {
            console.log("我的书名为:"+book.name+",作者为"+book.author+"....");
        };

        //003 把处理好的对象返回给我们 == 产品出厂
        return book;
    }
    var book1 = createBook("声名狼藉者的的生活","42.00","福柯","北京大学出版社");
    var book2 = createBook("人性的枷锁","49.00","毛姆","华东师范大学出版社");
    var book3 = createBook("悟空传","28.00","今何在","湖南文艺出版社");
    //01 相关说明
    //001 构造函数和普通函数的区别:首字母大写
    //002 构造函数的作用:用于完成对象的初始化
    //003 new关键字的作用:创建对象
    //02 自定义构造函数创建对象的基本写法
    function CreateBook (name,price,author,press) {
        //var book = new Object();  //外部使用new关键字,则内部会自动创建对象并赋值给this
        this.name = name;
        this.price = price;
        this.author = author;
        this.press = press;
        this.read = function () {
            console.log("我的书名为:"+this.name+",作者为"+this.author+"....");
        };
        //return book;   //创建出来的对象默认自动返回
    }
    var b1 = new CreateBook("声名狼藉者的的生活","42.00","福柯","北京大学出版社");
    var b2 = new CreateBook("人性的枷锁","49.00","毛姆","华东师范大学出版社");
    var b3 = new CreateBook("悟空传","28.00","今属性,并调用对象的方法测试
    console.log("________________________");
    console.log(b1.author);
    console.log(b2.author);
    console.log(b3.author);
    b1.read();
    b2.read();
    b3.read();
   
    //08 自定义构造函数通用写法
    function 构造函数名(参数1,参数2,参数3...) {
        //设置对象的属性
        this.属性01 = 参数1;
        this.属性02 = 参数2;
        //设置对象的方法
        this.方法01 = function () {
            //.....
        };
        this.方法02 = function () {
            //.....
        }
    }
    //09 自定义构造函数方式创建对象
    var 对象01 = new 构造函数名(实参01,实参02,实参03...);
    var 对象02 = new 构造函数名(实参01,实参02,实参03...);
</script>
  • 04 自定义构造函数和简单工厂函数的区别

    ① 函数的首字母大写(用于区别构造函数和普通函数)
    ② 创建对象的过程是由new关键字实现
    ③ 在构造函数内部会自动的创建新对象,并赋值给this指针
    ④ 自动返回创建出来的对象

  • 05 构造函数的执行过程:

    ① 使用new关键字创建对象
    ② 把新创建出来的对象赋值给this
    ③ 在构造函数内部,使用this为新创建出来的对象设置属性和方法
    ④ 默认返回新创建的对象(普通函数如果不显示的return则默认返回undefined)。

    //06 思考:在构造函数内部,可以写其他"无关的代码"吗?

  • 07 构造函数的返回值说明:

    • 01 如果在构造函数中没有显示的return,则默认返回的是新创建出来的对象
    • 02 如果在构造函数中显示的re何在","湖南文艺出版社");
    • 03 打印对象的turn,则依照具体的情况处理
      • [01] return 的是对象,则直接返回该对象,取而代之本该默认返回的新对象
      • [02] return 的是null或基本数据类型值,则返回新创建的对象
  • 构造函数方式创建对象存在的问题

每次创建对象,都会重新创建函数,那么如果创建的对象数量很多,而对象方法内部的实现一模一样,则造成了资源浪费

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 195,783评论 5 462
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 82,360评论 2 373
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 142,942评论 0 325
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,507评论 1 267
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,324评论 5 358
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,299评论 1 273
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,685评论 3 386
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,358评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,652评论 1 293
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,704评论 2 312
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,465评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,318评论 3 313
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,711评论 3 299
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,991评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,265评论 1 251
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,661评论 2 342
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,864评论 2 335

推荐阅读更多精彩内容