首先来讲一下构造函数创建对象。ECMAScript中的构造函数可用来创建特定类型的对象。请看下面示例了解一下构造函数模式:

function Person(name, age, job){this.name = name;this.age = age;this.job = job;this.sayName = sayName;
}function sayName(){alert(this.name);
}var person1 = new Person("Dawang", 22, "Softwaare Engineer");
var person2 = new Person("King", 23, "Doctor");person1.sayName();//Dawang
alert(person1.constructor == Person);//true
alert(person2.constructor == Person);//true

从代码中可以看出,person1和person2的constructor都指向Person,这两个实例既是Person的实例,也是Object的实例。但是,使用构造函数的缺点是,每个方法都要在每个实例上重新创建一遍。在上面的示例中,person1和person2都有一个sayName()方法,但是这两个方法不是同一个Function的实例。因为ECMAScript中的函数是对象,因此每定义一个函数,也就是实例化了一个对象。创建两个完成同样任务的Function实例没有必要,所以,采用的方法就是像上述代码那样,将函数定义转移到构造函数外部来解决。这样,sayName包含了一个指向函数的指针,person1和person2对象就共享了在全局作用域中定义的同一个sayName()函数。
在全局作用域中定义的函数实际上只能被某个函数调用,如果对象需要定义很多方法,那就要定义很多个全局函数,我们自定义的引用类型就没有封装性可言了。这一点可以通过原型模式来解决,我的上一篇文章已经介绍过,原型模式也有缺点。因此,实际上创建自定义类型的最常见方式,就是组合使用构造函数模式和原型模式。
构造函数模式用于定义实力属性,而原型模式用于定义方法和共享的属性。这样,每个实例都会有自己的一份实例属性的副本,同时又共享着对方法的引用,最大限度的节省了内存。这种混合模式还支持向构造函数传递参数,集合了两种模式之长。请看示例:

function Person(name, age, job){this.name = name;this.age = age;this.job = job;this.friends = ["Hongtao","Xiaosheng"];
}Person.protytype = {constructor: Person,sayName: function(){alert(this.name);}
}var person1 = new Person("Dawang", 22, "Softwaare Engineer");
var person2 = new Person("King", 23, "Doctor");person1.friends.push("Huazi");
alert(person1.friends);//"Hongtao,Xiaosheng,Huazi"
alert(person2.friends);//"Hongtao,Xiaosheng"
alert(person1.friends === person2.friends);//false
alert(person1.sayName === person2.sayName);//true

从示例中可以看出,修改person1.friends并不会影响person2.friends,因为它们分别引用了不同的数组。
这种构造函数和原型模式混合的模式,是ECMAScript中使用最广泛、认同度最高的一种创建自定义类型的方法。

javascript中组合使用构造函数模式和原型模式创建对象相关推荐

  1. JavaScript之面向对象学习六原型模式创建对象的问题,组合使用构造函数模式和原型模式创建对象...

    一.仔细分析前面的原型模式创建对象的方法,发现原型模式创建对象,也存在一些问题,如下: 1.它省略了为构造函数传递初始化参数这个环节,结果所有实例在默认的情况下都将取得相同的属性值,这还不是最大的问题 ...

  2. Javascript 构造函数模式、原型模式

    前两天写完组合继承,打算总结一下原型继承的,不过今天看了一下工厂模式.构造函数模式和原型模式,觉得有必要总结一下以加深印象. ------------------------------------- ...

  3. javascript 面向对象编程(工厂模式、构造函数模式、原型模式)

    javascript 面向对象编程(工厂模式.构造函数模式.原型模式) CreateTime--2018年3月29日17:09:38 Author:Marydon 一.工厂模式 /*** 工厂模式*/ ...

  4. js面向对象-组合使用构造函数模式和原型模式(使用最广泛、认同度最高)

    组合使用构造函数模式和原型模式 构造函数模式用于定义实例属性 原型模式用于定义方法和共享的属性 优点:每个实例都有自己的实例属性的副本,但同时共享对方法的引用,最大限度的节省内存 function P ...

  5. 中单引号怎么转义_在JavaScript中组合字符串的4种方法

    下面是在JavaScript中组合字符串的4种方法.我最喜欢的方法是使用模板字符串.为什么?因为它更具可读性,所以没有转义引号的反斜杠,没有笨拙的空格分隔符,也没有混乱的加号操作符 . const i ...

  6. 在JavaScript中组合字符串的4种方法

    下面是在JavaScript中组合字符串的4种方法.我最喜欢的方法是使用模板字符串.为什么?因为它更具可读性,所以没有转义引号的反斜杠,没有笨拙的空格分隔符,也没有混乱的加号操作符

  7. 一口气讲完设计模式(单例模式、工厂模式、原型模式、建造者模式、适配器、桥梁模式)

    设计模式 使用设计模式,可以让我们的代码具有更好的可读性.可扩展性.可读性.重用性.符合高内聚低耦合的特点.作为程序员,是我们经常听到的概念,也是我们程序员必须深入学习,了解的知识. 设计模式种类 该 ...

  8. JavaScript-设计模式(四) 原型模式

    JavaScript-设计模式(四) 原型模式 定义:原型模式(Prototype pattern)指的是使用一个原型的实例为模板,通过复制一个已经存在的实例来返回新的实例,而不是从头开始新建实例.原 ...

  9. 软件系统设计-4-建造者模式、原型模式

    1. 建造者模式 1.1. 模式动机 无论是在现实世界中还是在软件系统中,都存在一些复杂的对象,它们拥有多个组成部分,如汽车,它包括车轮.方向盘.发送机等各种部件.而对于大多数用户而言,无须知道这些部 ...

最新文章

  1. android fragmentpageradapter切换不更新,关于android:在FragmentPagerAdapter中更新当前片段...
  2. linux 标准输入句柄,标准文件描述符与标准文件句柄
  3. 【渝粤题库】陕西师范大学200221 中国思想史 作业(高起专)
  4. [2016-03-15]rabbitmq notes
  5. getSystemService
  6. 坚决拥护苹果!三星Galaxy S21系列发布:多支笔,充电器耳机却没了
  7. [转载] python--isalnum()函数
  8. 概要设计说明书任务分配
  9. python -json文件的使用---
  10. 浅论照明节能的系统设计
  11. 关于国标码最后一位校验码计算方法
  12. 大数据生态与Spark简介
  13. 考研高数 专题11:多元复合函数及隐函数求导的方法和技巧【灵活】
  14. itext7实现参数和图片替换
  15. 吴若权——洛可可动画电影馆
  16. DZZOffice(大桌子)企业文档协同平台教程系列(三)——ONLYOFFICE社区版部署、配置
  17. UG\NX二次开发 获取曲线上某个位置的点坐标、切线矢量、主法线矢量、副法线矢量 UF_MODL_ask_curve_props
  18. 王者荣耀改名神器助手微信小程序
  19. matlab 信号相位角,FFT信号处理后幅度、相角的问题
  20. C++中怎么暂停几秒

热门文章

  1. 6.GD32F103C8T6 定时器的基本使用
  2. anaconda激活python_Anaconda使用conda activate激活环境出错(待完全解决)2018-06-09
  3. 计算机体系架构学习笔记
  4. 数据结构和算法分析(三)——C++实现队列
  5. 初识OpenFlow协议
  6. Nand flash驱动的编写与移植
  7. android存电话号码,如何从android中删除联系人的电话号码?
  8. 没有ggplot这个函数_JavaScript学习笔记(四)——函数基础
  9. php mysql 降_php fork太多进程导致整体性能下降,mysql down掉的解决._PHP教程
  10. 【JVM】第二章 JVM类加载、JVM对象