对上一章节的工厂模式进行代码重写

  function Human(name, sex) {
this.name = name;
this.sex = sex;
this.say = function () {
alert(this.name);
}
}
var man = new Human("汉武大帝", "男");
var woman = new Human("王母娘娘","女");

看到Human没有.他的第一个字母大写了.这是一种语法约定.构造函数始终应该以一个大写字母开头,而非构造函数则以一个小写字母开头,用于区分构造函数和非构造函数.

要创建Human的实例,必须使用new操作符.这就会出现以下四个步骤:

1.创建一个新对象或变量.

2.将构造函数的作用域赋值给新变量或新对象.

3.执行构造函数中的代码

4.返回新对象.

 alert(man instanceof Object);//true
alert(man instanceof Human); //true
alert(woman instanceof Object); //true
alert(woman instanceof Human); //true

这里的true很好的说明了:创建自定义的构造函数意味着将来可以将他的实例表示为一种特定的类型.而这正是构造韩式模式优于工厂模式的地方.

尽管如此,构造函数还是有自己的一些缺陷,或者说不足吧.

在man和woman中都有一个名为say()的方法,他们的功能一模一样.但是这两个方法却不是同一个Function()实例创建出来的.

 function Human(name, sex) {
this.name = name;
this.sex = sex;
this.say = new Function("alert(this.name);");
}

这就意味着如果需要n个实例,就要创建n个say的Function()实例.这样还是会造成资源的浪费.

继续对上面的代码经行优化,让这个say()方法只创建一次.共用一个引用.

 function Human(name, sex) {
this.name = name;
this.sex = sex;
this.say = say;
}
function say() {
alert(this.name);
}

因为say包含一个指向函数的指针,因此Human的实例就共享了全局作用域中的同一个say()函数.但这个无法让人接受,

因为如果系统比较庞大的话,就会出现很多全局变量,一不小心就会有被改掉的危险.而我们封装的对象就没有封装性可言了.

接着就又有了原型模式了.下一章在接着说原型模式.

javascript创建对象之构造函数模式(二)的更多相关文章

  1. JavaScript面向对象OOM 2(JavaScript 创建对象的工厂模式和构造函数模式)

      在创建对象的时候,使用对象字面量和 new Object() 构造函数的方式创建一个对象是最简单最方便的方式.但是凡是处于初级阶段的事物都会不可避免的存在一个问题,没有普适性,意思就是说我要为世界 ...

  2. JavaScript设计模式之构造函数模式

    一.构造函数模式概念 构造函数用于创建特定类型的对象——不仅声明了使用过的对象,构造函数还可以接受参数以便第一次创建对象的时候设置对象的成员值.你可以自定义自己的构造函数,然后在里面声明自定义类型对象 ...

  3. javascript --- 设计模式之构造函数模式

    在JavaScript里,构造函数通常是认为用来实现实例的,JavaScript没有类的概念,但是有特殊的构造函数.通过new关键字来调用定义的否早函数,你可以告诉JavaScript你要创建一个新对 ...

  4. javascript创建对象之原型模式(三)

    少废话,先上代码: function Human() { } Human.prototype.name = "成吉思汗"; Human.prototype.sex = " ...

  5. javascript创建对象之工厂模式(一)

    工厂模式在软件工程里面是一种比较常见的设计模式了.这种模式抽象了创建具体对象的过程. 上代码: function createHuman(name,sex) { var obj = new Objec ...

  6. JS创建对象之构造函数模式

    function Person(name, age, job) { this.name = name; this.age = age; this.job = job; this.sayName = f ...

  7. javascript工厂模式和构造函数模式创建对象

    一.工厂模式 工厂模式是软件工程领域一种广为人知的设计模式,这种模式抽象了创建具体对象的过程(本书后面还将讨论其他设计模式及其在JavaScript 中的实现).考虑到在ECMAScript 中无法创 ...

  8. javascript创建对象的方法--构造函数模式

    javascript创建对象的方法--构造函数模式 一.总结 构造函数模式作用和不足 1.作用:解决工厂模式不是用new关键字来创建对象的弊端 2.作用:解决工厂模式创建的实例和模型没有内在联系的问题 ...

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

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

随机推荐

  1. django2 删除图片或其他

    首先从数据库中获取图片的名称,然后拼接图片的物理地址,最后就是删除. # 物理删除图片 d = os.path.dirname(os.path.dirname(os.path.abspath(__fi ...

  2. gradle仓库配置

    Android Studio使用Gradle构建app.Gradle的使用非常灵活,其中可以设置使用多种类型的仓库,来获取应用中使用的库文件.  支持的类型有如下几种: 类型 说明 Maven cen ...

  3. .Net EF Core数据库使用SQL server 2008 R2分页报错How to avoid the “Incorrect syntax near 'OFFSET'. Invalid usage of the option NEXT in the FETCH statement.”

    一.  问题说明 最近.Net EF core 程序部署到服务器,服务器数据库安装的是SQL server 2008 R2,我本地用的的是SQL server 2014,在用到分页查询时报错如下: H ...

  4. ES6 Generator 学习笔记一

    Generator 函数是 ES6 提供的一种异步编程解决方案,语法行为与传统函数完全不同. Generator 函数有多种理解角度.从语法上,首先可以把它理解成,Generator 函数是一个状态机 ...

  5. 【转载】Java枚举类型的使用

    枚举类型概念 package com.lxq.enumm; public class EnumDemoOne { private enum InnerEnum { RED, GREEN, YELLOW ...

  6. spark中saveAsTextFile如何最终生成一个文件

    原文地址: http://www.cnblogs.com/029zz010buct/p/4685173.html 一般而言,saveAsTextFile会按照执行task的多少生成多少个文件,比如pa ...

  7. SUST OJ 1674: 入侵与反击(最长不下降子序列)

    1674: 入侵与反击 时间限制: 1 Sec  内存限制: 128 MB提交: 229  解决: 28[提交][状态][讨论版] 题目描述 A国部署的反导系统遇到了一个致命BUG,那就是每一次发射的 ...

  8. Python集成开发环境搭建

    ===================== 开始学习Python的开发,首先得搭建好集成开发的环境! 分为下面几个步骤: 操作系统平台:Windows XP/7/10 都可以 1.安装并配置JDK运行 ...

  9. 前端css规范

    文章整理了Web前端开发中的各种CSS规范,包括文件规范.注释规范.命名规范.书写规范.测试规范等. 一.文件规范 1.文件均归档至约定的目录中(具体要求以豆瓣的CSS规范为例进行讲解): 所有的CS ...

  10. Java的四种引用之强弱软虚

    在java中提供4个级别的引用:强引用.软引用.弱引用和虚引用.除了强引用外,其他3中引用均可以在java.lang.ref包中找到对应的类.开发人员可以在应用程序中直接使用他们. 1 强引用 强引用 ...