javascript设计模式之对象工厂函数与构造函数详解


Posted in Javascript onJuly 30, 2015

下面通过文字详解加代码分析的方式给大家分享下javascript设计模式之对象工厂函数与构造函数的相关知识。

概述使用对象字面量,或者向空对象中动态地添加新成员,是最简单易用的对象创建方法。然而,除了这两种常用的对象创建方式,JavaScript还提供了其他方法创建对象。1).使用工厂函数创建对象我们可以编写一个函数,此函数的功能就是创建对象,可将其.

概述

使用对象字面量,或者向空对象中动态地添加新成员,是最简单易用的对象创建方法。
然而,除了这两种常用的对象创建方式,JavaScript还提供了其他方法创建对象。
1).使用工厂函数创建对象

我们可以编写一个函数,此函数的功能就是创建对象,可将其称为“对象工厂方法”。

//工厂函数     

 function createPerson(name, age, job) {         

 var o = new Object();         

 o.name = name;         

 o.age = age;         

 o.job = job;         

 o.sayName = function () {             

 console.info(this.name);         

 };         

 return o;      } //使用工厂函数创建对象     

 var person1 = createPerson('张三', 29, '软件工程师');     

 var person2 = createPerson('李四', 40, '医生');

2).定义对象构造函数

  a).对象构造函数首字母大写
  b).内部使用this关键字给对象添加成员
  c).使用new关键字调用对象构造函数

//定义对象“构造”函数      

function Person(name, age, job) { 

this.name = name;         

 this.age = age;          

this.job = job;          

this.sayName = function () {            
  console.info(this.name);          

};      

} //使用new调用对象构造函数创建对象     

 var p1 = new Person('张三', 29, '软件工程师');     
var p2 = new Person('李四', 40, '医生');

以普通方式调用的“构造函数”

构造函数其实也是一个函数,不同之处在于调用它时必须要加一个“new”关键字,如果不加这个关键字,则对它的调用被认为是普通函数调用。

 //作为普通函数调用的构造函数,通过this添加的属性,

//成为了window对象的属性与方法。

console.info(window.name);//张三

console.info(window.age); //29

console.info(window.job); //软件工程师

对象构造函数长得这个样:

function Person (name) {

this.name = name;

 this.say = function () {

 return "I am " + this.name;

  };

}

实际上是这样(示意):

function Person (name) {

// var this = {};

 this.name = name;

 this.say = function () {

return "I am " + this.name;

 };

    // return this;

}

构造函数完成的工作

1. 创建一个新的对象
2. 让构造函数的this引用这一新创建的对象
3. 执行构造函数中的代码,这些代码通常完成向新对象添加属性的工作
4. 向外界返回新创建的对象引用。
对象构造函数与对象工厂方法的区别

1. 对象构造函数中没有显式的对象创建代码
2. 新对象应具备的属性与方法是通过this引用添加的.
3. 对象构造函数中没有return语句
 通常会把对象构造函数的首字母设置为大写的,以区别于普通函数。
对象的constructor属性

a).使用对象工厂函数创建对象,每个对象的constructor属性引用Object()

 

var person = createPerson('张三', 29, '软件工程师');

 //使用工厂方法创建对象,
其constructor属性引用Object()函数

console.info(person1.constructor === Object); 
//true

b).使用对象构造函数创建对象,每个对象的constructor属性引用这个构造函数

var p = new Person('张三', 29, '软件工程师');

//使用对象构造函数创建对象,

//每个对象的constructor属性,引用这个构造函数

console.info(p.constructor === Person);

 //true如何避免“忘记”new?可以使用arguments.callee解决这个问题      

//了解arguments.callee的作用     

function TestArgumentsCallee()

 {          

console.info(this);          

console.info(this instanceof TestArgumentsCallee);         

 console.info(this instanceof arguments.callee);     

 };      

TestArgumentsCallee(); //window                                         
//false                                          

//false      

new TestArgumentsCallee();  

//TestArgumentsCallee              

//true                                             
  //true

于是,可以直接用arguments.callee

 //避免忘记new     

 function MyObject(value) 

{         

 if (!(this instanceof arguments.callee))
{             

 //如果调用者忘记加上new了,就加上new再调用一次             
return new MyObject(value);         

 }         

 this.prop = value;     

 }      

//测试      

var obj1 = new MyObject(100);     

 console.info(obj1.prop);//100     

 var obj2 = MyObject(200);        

console.info(obj2.prop); //200

以上内容就是javascript设计模式之对象工厂函数与构造函数详解,希望大家喜欢。

Javascript 相关文章推荐
腾讯与新浪的通过IP地址获取当前地理位置(省份)的接口
Jul 26 Javascript
js jquery数组介绍
Jul 15 Javascript
javascript内存管理详细解析
Nov 11 Javascript
jQuery实现图片轮播效果代码
Sep 27 Javascript
微信小程序 canvas API详解及实例代码
Oct 08 Javascript
使用vue-router beforEach实现判断用户登录跳转路由筛选功能
Jun 25 Javascript
Echart折线图手柄触发事件示例详解
Dec 16 Javascript
vue里的data要用return返回的原因浅析
May 28 Javascript
微信小程序如何刷新当前界面的实现方法
Jun 07 Javascript
微信小程序中如何使用flyio封装网络请求
Jul 03 Javascript
vue项目实现设置根据路由高亮对应的菜单项操作
Aug 06 Javascript
jquery实现简单每周轮换的日历
Sep 10 jQuery
js判断浏览器类型及设备(移动页面开发)
Jul 30 #Javascript
javascript中if和switch,==和===详解
Jul 30 #Javascript
用javascript实现自动输出网页文本
Jul 30 #Javascript
理解javascript中的原型和原型链
Jul 30 #Javascript
原生js与jQuery实现简单的tab切换特效对比
Jul 30 #Javascript
文字垂直滚动之javascript代码
Jul 29 #Javascript
如何使用jQuery技术开发ios风格的页面导航菜单
Jul 29 #Javascript
You might like
php模板函数 正则实现代码
2012/10/15 PHP
thinkphp普通查询与表达式查询实例分析
2014/11/24 PHP
laravel5创建service provider和facade的方法详解
2016/07/26 PHP
微信公众平台开发-微信服务器IP接口实例(含源码)
2017/03/05 PHP
浅谈PHP表单提交(POST&GET&URL编/解码)
2017/04/03 PHP
PHP获取日期对应星期、一周日期、星期开始与结束日期的方法
2018/06/22 PHP
vmware linux系统安装最新的php7图解
2019/04/14 PHP
利用404错误页面实现UrlRewrite的实现代码
2008/08/20 Javascript
javascript下IE与FF兼容函数收集
2008/09/17 Javascript
IE图片缓存document.execCommand("BackgroundImageCache",false,true)
2011/03/01 Javascript
JavaScript利用正则表达式去除日期中的“-”
2014/07/01 Javascript
node.js中的fs.fchmod方法使用说明
2014/12/16 Javascript
javascript弹出带文字信息的提示框效果
2016/07/19 Javascript
JS之相等操作符详解
2016/09/13 Javascript
JS简单获取日期相差天数的方法
2017/04/24 Javascript
Form表单上传文件(type="file")的使用
2017/08/03 Javascript
详谈DOM简介及节点、属性、查找节点的方法
2017/11/16 Javascript
jQuery Datatables表头不对齐的解决办法
2017/11/27 jQuery
JavaScript类型相关的常用操作总结
2019/02/14 Javascript
微信小程序实现一张或多张图片上传(云开发)
2019/09/25 Javascript
vue 使用插槽分发内容操作示例【单个插槽、具名插槽、作用域插槽】
2020/03/06 Javascript
TensorFlow模型保存和提取的方法
2018/03/08 Python
Python中xml和json格式相互转换操作示例
2018/12/05 Python
Python使用python-docx读写word文档
2019/08/26 Python
Python插入Elasticsearch操作方法解析
2020/01/19 Python
如何解决tensorflow恢复模型的特定值时出错
2020/02/06 Python
浅析关于Keras的安装(pycharm)和初步理解
2020/10/23 Python
Python字符串对齐、删除字符串不需要的内容以及格式化打印字符
2021/01/23 Python
HTML5实时语音通话聊天MP3压缩传输3KB每秒
2019/08/28 HTML / CSS
北美主要的汽车零部件零售商:AutoShack.com
2019/02/23 全球购物
一份比较全的PHP面试题
2016/07/29 面试题
机械化及自动化毕业生的自我评价分享
2013/11/06 职场文书
安全资料员岗位职责
2013/12/14 职场文书
会计电算化大学生职业规划书
2014/02/05 职场文书
2014高考励志标语
2014/06/05 职场文书
工厂员工辞职信范文
2015/05/12 职场文书