在上一篇文章中我们介绍了JavaScript简单对象的创建方法,简单js对象的最大问题是由于没有类的约束,无法实现对象的重复利用,并且没有一种约定,在操作时会带来问题。所以人们从设计模式中借用了一种工厂模式来创建JavaScript对象。

使用工厂方法创建JavaScript对象

工厂方法的的思路是在一个函数中创建一个对象,然后为这个对象设置相应的属性和方法,最后将这个对象返回。通过函数来封装,以特定的接口创建对象。下面是一个以工厂方法创建person对象的例子:

function createPerson(name,age){

var o = new Object();

o.name = name;

o.age = age;

o.say = function(){

alert(this.name + "," + this.age);

}

return o;

}

// 实例化p1和p2对象

var p1 = createPerson("Leon",22);

var p2 = createPerson("Ada",20);

//调用p1和p2对象的say()方法

p1.say();

p2.say();

使用工厂方法虽然有效的解决了类的问题,但是依然存在另外一个问题。我们无法检测对象p1和p2的数据类型。我们使用typeof仅仅只能检测出对象是一个Object类型:

console.info(typeof p1); // 控制台输出:Object

如果我们想要使用instanceof来判断对象的类型,那么p1 instanceof ?,instanceof后面要填写什么类型呢?我们并不知道。

使用构造函数创建JavaScript对象

由于工厂方法不能确定对象的具体类型,所以人们又提出了一种新的创建JavaScript对象的方法——构造函数方法。在JavaScript中构造函数可以用来创建特定类型的对象,例如Object和Array这些js原生构造函数,在运行时会自动出现在执行环境中。我们也可以自定义构造函数,从而定义自定义类型的属性和方法。

使用构造函数来创建类和基于工厂的方式来创建类的方法相似,最大的区别是函数的名称就是类的名称。通常按照编程规范的约定,类的第一个字母大写。使用构造函数创建类时,在函数内部通过this关键字来完成属性的定义。

// 使用构造函数方式来创建Person类

function Person(name,age){

this.name = name;

this.age = age;

this.say = function(){

console.info(this.name + "," + this.age);

}

}

// 通过new关键字来创建对象

var p1 = new Person("Leon",22);

var p2 = new Person("Ada",20);

// 调用对象的方法

p1.say();

p1.say();

如上面的代码所示,在完成类的创建之后,我们可以通过new关键字来实例化对象。

使用构造函数的方式很好的解决了检测对象类型的问题,我们可以通过instanceof关键字来判断对象是不是Person类型:

console.info(p1 instanceof Person); //控制台显示:true

console.info(p2 instanceof Person); //控制台显示:true

另外,我们还可以通过constructor关键字来查看对象的构造函数是否是Person类型:

console.info(p1.constructor == Person); //控制台显示:true

console.info(p2.constructor == Person); //控制台显示:true

或者直接打印出p1和p2的构造函数来进行比较:

console.info(p1.constructor);

console.info(p2.constructor);

使用构造函数方法给我们所带来的问题是每一个对象中都会存在一个方法的拷贝,如果对象的方法很多的话,就会占用大量的内存空间。

在一些高级的编译型的面向对象编程语言(如Java)中,对象的方法是在运行时动态在栈区产生的,它们不会占用内存。而在Javascript中,使用构造函数方法创建的对象,对象中的每一个方法都是类方法的一个拷贝,如果对象中存在大量的方法,就会占用大量的内存空间。

我们可以将类的方法放到全局变量中来定义,这样可以让类中的方法指向同一个函数。代码如下:

// 使用构造函数方式来创建Person类

function Person(name,age){

this.name = name;

this.age = age;

// 此时的类方法是一个全局方法的引用

this.say = say;

}

//将方法设置为全局的方法

function say(){

alert(this.name + "," + this.age);

}

通过将类的方法设置为全局方法,可以解决对象中的方法占用内存空间的问题,此时,通过构造函数创建的所有对象中的方法都指向同一个全局函数。

但是如果将所有的方法都设置为全局函数,这些函数都可以被window调用,此时就破坏了对象的封装性,而且如果某个对象有大量的方法,就会导致代码中有大量的全局函数,这样也不利于我们的开发。

为了解决构造函数方法存在这些缺陷,我们就要使用原型来创建对象,下一篇文章我们将介绍使用原型来创建JavaScript对象。

相关阅读

html5创建对象的方法,JavaScript面向对象-使用工厂方法和构造函数方法创建对象...相关推荐

  1. JavaScript 面向对象之工厂模式与构造函数详解

    面向对象 什么是面向对象? 所谓的面向对象,是一种编程思想,编程思路,代码的书写格式. 之前为了简化代码,我们是将程序封装为函数的形式来调用 函数会有一些小问题:: 函数内部定义的局部作用域变量,函数 ...

  2. JavaScript中的工厂函数vs构造函数vs class

    原文链接:JavaScript Factory Functions vs Constructor Functions vs Classes 作者:Eric Elliott 译者:sunny 转载需提前 ...

  3. JavaScript 面向对象编程(二) —— 构造函数 / 原型 / 继承 / ES5 新增方法

    本篇为 JavaScript 进阶 ES6 系列笔记第二篇,将陆续更新后续内容.参考:JavaScript 进阶面向对象 ES6 :ECMAScript 6 入门 : Javascript 继承机制的 ...

  4. java 构造方法和析构方法_PHP面向对象程序设计之构造方法和析构方法详解

    本文实例讲述了PHP面向对象程序设计之构造方法和析构方法.分享给大家供大家参考,具体如下: 构造方法和析构方法是对象中的两个特殊方法,它们都与对象的生命周期有关.构造方法是对象创建完成后第一个被对象自 ...

  5. javascript 面向对象 new 关键字 原型链 构造函数

    JavaScript面向对象 JavaScript 语言使用构造函数(constructor)作为对象的模板.所谓"构造函数",就是专门用来生成实例对象的函数.它就是对象的模板,描 ...

  6. python类的内置方法_python面向对象之类中的内置方法

    __setattr__,__delattr__,__getattr__,__getattribute__以及标准类型的二次加工 __setattr__,__delattr__,__getattr__的 ...

  7. Javascript面向对象编程(二) 构造函数的继承

    标注:(转载自:http://www.jb51.net/article/28128.htm) 今天要介绍的是,如何生成一个"继承"多个对象的实例.  比如,现在有一个"动 ...

  8. python中常见的双下方法_python中常见的双下方法_python面向对象(5)__特殊双下方法...

    双下方法 双下方法是开发python这个语言程序员用的,源码中使用的. 我们不能轻易使用双下方法.可能重新写object的源码,慎用!!! 双下方法特征:你不知道干啥了,就会触发某个双下方法 len ...

  9. 工厂方法模式、简单工厂模式、抽象工程模式

    1.概述 工厂设计模式是一种创建型模式,它提供了一种创建对象的最佳方式.在工厂模式中,我们创建对象时不会对客户端暴露创建逻辑,并且是通过使用一个共同的接口来指向新创建的对象. 1.1. 针对的问题 在 ...

最新文章

  1. C语言格式控制符和转义字符
  2. css对称旋转,CSS3 transform平面旋转
  3. RHEL7 timedatectl命令
  4. 基于.NET Core的简单,跨平台,模块化的电子商务系统-SimplCommerce
  5. 使用命令行导出 SQL Server 数据层应用程序
  6. 2.1 vector
  7. (16)FPGA面试技能提升篇(Python)
  8. (第十一章)数据表的增删改
  9. 验证二叉树后序遍历序列是否符合要求
  10. mysql导出成execl
  11. 新的特洛伊木马程序SectopRAT用以控制浏览器会话
  12. java导出excel加水印且加密(已实现)
  13. Python大数据分析系列
  14. transition动画
  15. ppt打不开服务器上的文件,PPT文件打不开的原因及解决方法
  16. java中函数编程的妙用
  17. 在数据库中,视图有什么用?什么时候需要用到视图?
  18. Thinking in java-35 String 字符串
  19. 微信团队分享:微信直播聊天室单房间1500万在线的消息架构演进之路
  20. 【优化求解】基于Levy改进哈里斯鹰算法LHHO求解最优目标matlab代码

热门文章

  1. 组态中常用c语言代码,工业组态软件中CFC语言的设计实现及语言转换的研究
  2. 脚本安装mysql数据库_Linux使用脚本安装MySQL数据库
  3. 单片机c语言随机数,单片机C语言如何产生随机数
  4. mysql中if在oracle怎么用_MySql和Oracle的使用
  5. 提取某一个镇的行政边界_接口测试:A04_HttpRunner通用_02_提取数据_02_regex方式
  6. python连不上树莓派_Python实现树莓派WiFi断线自动重连
  7. hive把字符串转换为时间_关于hive的时间转换
  8. iphonex黑屏开不了机_手机突然黑屏开不了机充电没反应怎么办?别急,这样就可以解决...
  9. J-Link该如何升级固件?
  10. 计算机文化基础课程总结,计算机文化基础课程总结.docx