本篇体验通过硬编码、工厂模式、构造函数来创建JavaScript对象。

□ 通过硬编码创建JavaScript对象

当需要创建一个JavaScript对象时,我们可能这样写:

        var person = {
            firstName: "Darren",
            lastName: "Ji",
            getFullName: function() {
                return this.firstName + " " + this.lastName;
            }
        };

如果需要创建2个结构相同的对象,我们可能这样写:

        var person = {
            firstName: "Darren",
            lastName: "Ji",
            getFullName: function() {
                return this.firstName + " " + this.lastName;
            }
        };

        var person2 = {
            firstName: "Darren2",
            lastName: "Ji2",
            getFullName: function () {
                return this.firstName + " " + this.lastName;
            }
        };

□ 通过工厂模式创建JavaScript对象

但实际上,还可以通过工厂模式来创建JavaScript对象。

       var person1 = createPerson("Darren1", "Ji1"),
            person2 = createPerson("Darren2", "Ji2");

        function createPerson(firstName, lastName) {
            return {
                firstName: firstName,
                lastName: lastName,
                getFullName: function() {
                    return this.firstName + " " + this.lastName;
                }
            };
        }


继续在createPerson函数中增加一个方法,并调用。

        var person1 = createPerson("Darren1", "Ji1"),
            person2 = createPerson("Darren2", "Ji2");

        alert(person1.greet(person2));

        function createPerson(firstName, lastName) {
            return {
                firstName: firstName,
                lastName: lastName,
                getFullName: function() {
                    return this.firstName + " " + this.lastName;
                },
                greet: function(person) {
                    if (typeof person.getFullName !== "undefined") {
                        return "hello, " + person.getFullName();
                    } else {
                        return "are u here?";
                    }
                }
            };
        }


输出结果:hello, Darren2 Ji2

如果person1.greet方法的实参为匿名对象,如下:

alert(person1.greet({}));

输出结果:are u here?

□ 通过构造函数创建JavaScript对象

就像通过var arr = new Array()创建数组对象,通过var date = new Date()创建日期对象,JavaScript允许我们创建自定义数据类型。

        var Person = function(firstName, lastName) {
            this.firstName = firstName;
            this.lastName = lastName;

            this.getFullName = function() {
                return this.firstName + " " + this.lastName;
            };

            this.greet = function(person) {
                if (person instanceof  Person) {
                    return "hello, " + person.getFullName();
                } else {
                    return "are u here?";
                }
            };
        };

        var person1 = new Person("Darren", "Ji"),
            person2 = new Person("Jack", "Zhang");

        alert(person1.greet({
            getFullName: "this is string"
        }));

输出结果:are u here?

○ 变量Peson的第一个字母大写,这是一个惯例,表示Peson是自定义数据类型
○ this表示Person对象
○ instanceof用来判断变量是否是某种数据类型
○ 通过new来创建数据类型对象,new关键字不可获取,否则,在本例中this会指向window
○ 因为person1.greet()的实参不是Peson类型,所以输出了are u here?

如果把最后一行代码改成:

alert(person1.greet(person2));

输出结果:hello, Jack Zhang

但这里还有一点小问题:getFullName和greet可看作是对象,每次通过new创建Peson对象时,相当于在内存上创建了2份的Peson对象,以及2份的getFullName和greet对象,这增加了内存开销。是否可以让getFullName和greet放到一个公共的地方,然后每个Peson对象都可以引用他们呢?--prototype属性此时就可以用上了!

        var Person = function(firstName, lastName) {
            this.firstName = firstName;
            this.lastName = lastName;
        };

        Person.prototype.getFullName = function () {
            return this.firstName + " " + this.lastName;
        };

        Person.prototype.greet = function (person) {
            if (person instanceof Person) {
                return "hello, " + person.getFullName();
            } else {
                return "are u here?";
            }
        };

        var person1 = new Person("Darren", "Ji"),
            person2 = new Person("Jack", "Zhang");

        alert(person1.greet(person2));

输出结果:hello, Jack Zhang

以上,在Peson的prototype属性上定义的方法,能够被每个Peson对象共享,这从一定程度上减少了内存开销。

“JavaScript进阶系列”包括:

JavaScript进阶系列01,函数的声明,函数参数,函数闭包

JavaScript进阶系列02,函数作为参数以及在数组中的应用

JavaScript进阶系列03,通过硬编码、工厂模式、构造函数创建JavaScript对象

JavaScript进阶系列04,函数参数个数不确定情况下的解决方案

JavaScript进阶系列05,事件的执行时机, 使用addEventListener为元素同时注册多个事件,事件参数

JavaScript进阶系列06,事件委托

JavaScript进阶系列07,鼠标事件

JavaScript进阶系列03,通过硬编码、工厂模式、构造函数创建JavaScript对象的更多相关文章

  1. JavaScript进阶系列07,鼠标事件

    鼠标事件有Keydown, Keyup, Keypress,但Keypress与Keydown和Keyup不同,如果按ctrl, shift, caps lock......等修饰键,不会触发Keyp ...

  2. JavaScript进阶系列06,事件委托

    在"JavaScript进阶系列05,事件的执行时机, 使用addEventListener为元素同时注册多个事件,事件参数"中已经有了一个跨浏览器的事件处理机制.现在需要使用这个 ...

  3. JavaScript进阶系列05,事件的执行时机, 使用addEventListener为元素同时注册多个事件,事件参数

    本篇体验JavaScript事件的基本面,包括: ■ 事件必须在页面元素加载之后起效■ 点击事件的一个简单例子■ 为元素注册多个点击事件■ 获取事件参数 ■ 跨浏览器事件处理 □ 事件必须在页面元素加 ...

  4. JavaScript进阶系列04,函数参数个数不确定情况下的解决方案

    本篇主要体验函数参数个数不确定情况下的一个解决方案.先来看一段使用函数作为参数进行计算的实例. var calculate = function(x, y, fn) { return fn(x, y) ...

  5. JavaScript进阶系列02,函数作为参数以及在数组中的应用

    有时候,把函数作为参数可以让代码更简洁. var calculator = { calculate: function(x, y, fn) { return fn(x, y); } }; var su ...

  6. JavaScript进阶系列01,函数的声明,函数参数,函数闭包

    本篇主要体验JavaScript函数的声明.函数参数以及函数闭包. □ 函数的声明 ※ 声明全局函数 通常这样声明函数: function doSth() { alert("可以在任何时候调 ...

  7. 通过硬编码获取dubbo服务对象

    运维进行监控dubbo服务的时候可能会调用dubbo服务对象,并且定期去执行,这时候如果需要添加新的服务,可能需要修改监控dubbo服务的配置,即dubbo-producer.xml或是dubbo-c ...

  8. 03.设计模式_抽象工厂模式(Abstract Fcatory)

    抽象工厂模式:创建一些列相关或者互相依赖的对象的接口,而无需指定他们具体的类, 1.创建工厂Factory: package patterns.design.factory; import java. ...

  9. Java 设计模式系列(二)简单工厂模式和工厂方法模式

    Java 设计模式系列(二)简单工厂模式和工厂方法模式 实现了创建者和调用者的分离.分为:简单工厂模式.工厂方法模式.抽象工厂模式 简单工厂模式.工厂方法模式都很简单,就不详细介绍了. 一.简单工厂 ...

随机推荐

  1. 如何将java项目转化为web项目

    1.修改工程文件 找到项目工作空间目录,打开.project文件,找到:<natures> </natures>代码段,在代码段中加入如下内容并保存:<nature> ...

  2. VM workstation 与 VM vSphere的区别 [转载]

    在学完vSphere后,想起了VMware Workstation.这两个都是虚拟化的东西,这两者到底有什么本质的不同呢?顺着我的思路我开始将所学过的进行检索期望从中寻到一丝半点的线索.很快大脑中建立 ...

  3. java 通过异常处理错误

    java的基本理念是"结构不佳的代码不能够运行" 一.概念 发现错误的理想时机是编译阶段,然而,编译期间并不能找出所有的错误,余下的问题必须在运行时期解决. 二.基本异常 异常情形 ...

  4. Java编程的逻辑 (61) - 内存映射文件及其应用 - 实现一个简单的消息队列

    本系列文章经补充和完善,已修订整理成书<Java编程的逻辑>,由机械工业出版社华章分社出版,于2018年1月上市热销,读者好评如潮!各大网店和书店有售,欢迎购买,京东自营链接:http:/ ...

  5. hdu 2795 公告板 (单点最值)

    题意:有个公告板,大小为h*w,要贴n张公告,每个公告的长度是x,高度固定为1,公告放的要尽可能靠上并尽可能靠左,每给出一张公告,要求这个公告在满足要求的情况下放在了第几层. Sample Input ...

  6. Vuejs 高仿饿了么外卖APP 百度云视频教程下载

    Vuejs 高仿饿了么外卖APP 百度云视频教程下载 链接:https://pan.baidu.com/s/1KPbKog0qJqXI-2ztQ19o7w 提取码: 关注公众号[GitHubCN]回复 ...

  7. 【LOJ】#2496. 「AHOI / HNOI2018」毒瘤

    题面 还有这么诚实的出题人! 我们最多影响20个点,然后把这20个点的虚树建出来,并且枚举每个点的选举状态,如果一个点选或不选可以通过改\(dp[u][0] = 0\)或\(dp[u][1] = 0\ ...

  8. 【LOJ】#2081. 「JSOI2016」反质数序列

    题解 我居然都没反应过来二分图内选集合两两不能有边是最大独立集了 我退役吧 显然连边只能在奇数和偶数之间,然后二分图求最大独立集是节点数-最大匹配数 啊当然还有对于1的话只能留一个1 代码 #incl ...

  9. Zookeeper项目开发环境搭建(Eclipse\MyEclipse + Maven)

    写在前面的话 可详细参考,一定得去看 HBase 开发环境搭建(Eclipse\MyEclipse + Maven) 我这里,相信,能看此博客的朋友,想必是有一定基础的了.我前期写了大量的基础性博文. ...

  10. 标签传播算法(llgc 或 lgc)

    动手实践标签传播算法 复现论文:Learning with Local and Global Consistency1 lgc 算法可以参考:DecodePaper/notebook/lgc 初始化算 ...