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 相关文章推荐
js自定义鼠标右键的实现原理及源码
Jun 23 Javascript
如何调试异步加载页面里包含的js文件
Oct 30 Javascript
jQuery中removeClass()方法用法实例
Jan 05 Javascript
JavaScript实现的经典文件树菜单效果
Sep 08 Javascript
jQuery实现鼠标经过事件的延时处理效果
Aug 20 Javascript
Angular JS数据的双向绑定详解及实例
Dec 31 Javascript
Angular 向组件传递模板的两种方法
Feb 23 Javascript
vue-router 起步步骤详解
Mar 26 Javascript
jQuery实现checkbox全选、反选及删除等操作的方法详解
Aug 02 jQuery
VUE实现密码验证与提示功能
Oct 18 Javascript
jQuery实现点击滚动到指定元素上的方法分析
Mar 19 jQuery
浅谈element中InfiniteScroll按需引入的一点注意事项
Jun 05 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
Apache+php+mysql在windows下的安装与配置图解(最新版)
2008/11/30 PHP
PHP使用file_get_content设置头信息的方法
2016/02/14 PHP
php中file_get_contents()函数用法实例
2019/02/21 PHP
Laravel统计一段时间间隔的数据方法
2019/10/09 PHP
PHP的new static和new self的区别与使用
2019/11/27 PHP
js cookies实现简单统计访问次数
2009/11/24 Javascript
Visual Studio中的jQuery智能提示设置方法
2010/03/27 Javascript
javascript实现TreeView 无刷新展开的实例代码
2013/07/13 Javascript
jQuery中after()方法用法实例
2014/12/25 Javascript
JS+CSS实现实用的单击输入框弹出选择框的方法
2015/02/28 Javascript
javascript实现动态改变层大小的方法
2015/05/14 Javascript
jQuery跨域问题解决方案
2015/08/03 Javascript
vue中渐进过渡效果实现
2016/10/27 Javascript
Vue常用指令V-model用法
2017/03/08 Javascript
详解基于DllPlugin和DllReferencePlugin的webpack构建优化
2018/06/28 Javascript
详解Angular6 热加载配置方案
2018/08/18 Javascript
浅谈vuex actions和mutation的异曲同工
2018/12/13 Javascript
Vue.js标签页组件使用方法详解
2019/10/19 Javascript
聊聊Vue中provide/inject的应用详解
2019/11/10 Javascript
详解element上传组件before-remove钩子问题解决
2020/04/08 Javascript
[49:40]2018DOTA2亚洲邀请赛小组赛 A组加赛 TNC vs Newbee
2018/04/03 DOTA
[01:02:04]EG vs Liquid 2019国际邀请赛淘汰赛 败者组 BO3 第一场 8.23
2019/09/05 DOTA
讲解python参数和作用域的使用
2013/11/01 Python
[原创]Python入门教程5. 字典基本操作【定义、运算、常用函数】
2018/11/01 Python
在unittest中使用 logging 模块记录测试数据的方法
2018/11/30 Python
python定时复制远程文件夹中所有文件
2019/04/30 Python
解决python中导入win32com.client出错的问题
2019/07/26 Python
Python SSL证书验证问题解决方案
2020/01/13 Python
python多项式拟合之np.polyfit 和 np.polyld详解
2020/02/18 Python
解决Python spyder显示不全df列和行的问题
2020/04/20 Python
html5指南-4.使用Geolocation实现定位功能
2013/01/07 HTML / CSS
澳大利亚礼品卡商店:Gift Card Store
2019/06/24 全球购物
AURALog面试题软件测试方面
2013/10/22 面试题
个人求职信范文分享
2013/12/13 职场文书
大学生村官典型材料
2014/01/12 职场文书
Dubbo+zookeeper搭配分布式服务的过程详解
2022/04/03 Java/Android