javascript工厂模式和构造函数模式创建对象方法解析


Posted in Javascript onDecember 30, 2016

工厂模式是软件工程领域一种广为人知的设计模式,这种模式抽象了创建具体对象的过程(本书后面还将讨论其他设计模式及其在JavaScript 中的实现)。考虑到在ECMAScript 中无法创建类,开发人员就发明了一种函数,用函数来封装以特定接口创建对象的细节,如下面的例子所示。

function createPerson(name, age, job){
 var o = new Object();
 o.name = name;
 o.age = age;
 o.job = job;
 o.sayName = function(){
 alert(this.name);
 };
 return o;
}
var person1 = createPerson("Nicholas", 29, "Software Engineer");
var person2 = createPerson("Greg", 27, "Doctor");

函数createPerson()能够根据接受的参数来构建一个包含所有必要信息的Person 对象。可以无数次地调用这个函数,而每次它都会返回一个包含三个属性一个方法的对象。工厂模式虽然解决了创建多个相似对象的问题,但却没有解决对象识别的问题(即怎样知道一个对象的类型)。随着JavaScript的发展,又一个新模式出现了。

二、构造函数模式

像Object 和Array 这样的原生构造函数,在运行时会自动出现在执行环境中。此外,也可以创建自定义的构造函数,从而定义自定义对象类型的属性和方法。例如,可以使用构造函数模式将前面的例子重写如下。

function Person(name, age, job){
 this.name = name;
 this.age = age;
 this.job = job;
 this.sayName = function(){
 alert(this.name);
 };
}
var person1 = new Person("Nicholas", 29, "Software Engineer");
var person2 = new Person("Greg", 27, "Doctor");

在这个例子中,Person()函数取代了createPerson()函数。我们注意到,Person()中的代码除了与createPerson()中相同的部分外,还存在以下不同之处:

  • 没有显式地创建对象;
  • 直接将属性和方法赋给了this 对象;
  • 没有return 语句。

以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,同时也希望多多支持三水点靠木!

Javascript 相关文章推荐
使用EXT实现无刷新动态调用股票信息
Nov 01 Javascript
js跨域访问示例(客户端/服务端)
May 19 Javascript
自己封装的javascript事件队列函数版
Jun 12 Javascript
使用text方法获取Html元素文本信息示例
Sep 01 Javascript
jQuery选择器源码解读(六):Sizzle选择器匹配逻辑分析
Mar 31 Javascript
JS中的eval 为什么加括号
Apr 13 Javascript
AngularJS基础 ng-include 指令简单示例
Aug 01 Javascript
使用webpack搭建react开发环境的方法
May 15 Javascript
select2 ajax 设置默认值,初始值的方法
Aug 09 Javascript
对VUE中的对象添加属性
Sep 18 Javascript
Puppeteer环境搭建的详细步骤
Sep 21 Javascript
layui 表格操作列按钮动态显示的实现方法
Sep 06 Javascript
ajax图片上传,图片异步上传,更新实例
Dec 30 #Javascript
浅谈JavaScript的函数及作用域
Dec 30 #Javascript
解析ajaxFileUpload 异步上传文件简单使用
Dec 30 #Javascript
JS实现的样式切换功能tableCSS实例
Dec 30 #Javascript
浅谈js script标签中的预解析
Dec 30 #Javascript
jQuery实现页面顶部下拉广告
Dec 30 #Javascript
jQuery Password Validation密码验证
Dec 30 #Javascript
You might like
windows下PHP APACHE MYSQ完整配置
2007/01/02 PHP
php快速url重写更新版[需php 5.30以上]
2010/04/25 PHP
用Json实现PHP与JavaScript间数据交换的方法详解
2013/06/20 PHP
利用PHPStorm如何开发Laravel应用详解
2017/08/30 PHP
php 使用 __call实现重载功能示例
2019/11/18 PHP
解析DHTML,JavaScript,DOM,BOM以及WEB标准的描述
2013/06/19 Javascript
解析JSON对象与字符串之间的相互转换
2013/12/18 Javascript
自编jQuery插件实现模拟alert和confirm
2014/09/01 Javascript
使用javascript实现监控视频播放并打印日志
2015/01/05 Javascript
js判断手机和pc端选择不同执行事件的方法
2015/01/30 Javascript
javascript中JSON对象与JSON字符串相互转换实例
2015/07/11 Javascript
jquery自适应布局的简单实例
2016/05/28 Javascript
JScript实现表格的简单操作
2017/08/15 Javascript
ant-design-vue 实现表格内部字段验证功能
2019/12/16 Javascript
Openlayers实现点闪烁扩散效果
2020/09/24 Javascript
在vue中使用jsonp进行跨域请求接口操作
2020/10/29 Javascript
Vue用mixin合并重复代码的实现
2020/11/27 Vue.js
Python自动重试HTTP连接装饰器
2015/04/28 Python
Python中的日期时间处理详解
2016/11/17 Python
python 读取DICOM头文件的实例
2018/05/07 Python
Python中Numpy包的安装与使用方法简明教程
2018/07/03 Python
Python Numpy 控制台完全输出ndarray的实现
2020/02/19 Python
Python中and和or如何使用
2020/05/28 Python
Python unittest生成测试报告过程解析
2020/09/08 Python
HTC VIVE美国官网:VR虚拟现实眼镜
2018/02/13 全球购物
this关键字的作用
2016/01/30 面试题
仓库门卫岗位职责
2013/12/22 职场文书
宿舍违规检讨书
2014/01/12 职场文书
社区工作者思想汇报
2014/01/13 职场文书
幼儿园老师辞职信
2014/01/20 职场文书
运动会入场式解说词
2014/02/18 职场文书
2014年司法局工作总结
2014/12/11 职场文书
计生个人工作总结
2015/02/28 职场文书
使用canvas实现雪花飘动效果的示例代码
2021/03/30 HTML / CSS
面试中老生常谈的MySQL问答集锦夯实基础
2022/03/13 MySQL
Redis+AOP+自定义注解实现限流
2022/06/28 Redis