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 相关文章推荐
图片上传即时显示缩略图的js代码
May 27 Javascript
由JavaScript中call()方法引发的对面向对象继承机制call的思考
Sep 12 Javascript
jQuery获得页面元素的绝对/相对位置即绝对X,Y坐标
Mar 06 Javascript
JS中类或对象的定义说明
Mar 10 Javascript
jQuery实现新消息在网页标题闪烁提示
Jun 23 Javascript
JavaScript数组去重的几种方法效率测试
Oct 23 Javascript
jQuery时间日期三级联动(推荐)
Nov 27 Javascript
Bootstrap中data-target 到底是什么
Feb 14 Javascript
AngularJS 购物车全选/取消全选功能的实现方法
Aug 14 Javascript
原生js通过一行代码实现简易轮播图
Jun 05 Javascript
Vue3 中的数据侦测的实现
Oct 09 Javascript
JS实现关闭小广告特效
Jan 29 Javascript
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
关于WordPress的SEO优化相关的一些PHP页面脚本技巧
2015/12/10 PHP
Smarty模板变量调节器用法分析
2016/05/23 PHP
javascript编程起步(第二课)
2007/02/27 Javascript
top.location.href 没有权限 解决方法
2008/08/05 Javascript
firefox浏览器不支持innerText的解决方法
2013/08/07 Javascript
jquery获取radio值实例
2014/10/16 Javascript
jquery ajax分页插件的简单实现
2016/01/27 Javascript
JS实现点击登录弹出窗口同时背景色渐变动画效果
2016/03/25 Javascript
使用Object.defineProperty实现简单的js双向绑定
2016/04/15 Javascript
Bootstrap Table使用方法解析
2016/10/19 Javascript
jQuery实现优雅的弹窗效果(6)
2017/02/08 Javascript
Node 升级到最新稳定版的方法分享
2018/05/17 Javascript
Vue使用axios出现options请求方法
2019/05/30 Javascript
vue列表数据发生变化指令没有更新问题及解决方法
2020/01/16 Javascript
vue中 v-for循环的用法详解
2020/02/19 Javascript
linux环境下安装pyramid和新建项目的步骤
2013/11/27 Python
python中黄金分割法实现方法
2015/05/06 Python
使用python来调用CAN通讯的DLL实现方法
2019/07/03 Python
PyTorch 对应点相乘、矩阵相乘实例
2019/12/27 Python
Python代码中如何读取键盘录入的值
2020/05/27 Python
解决Python安装cryptography报错问题
2020/09/03 Python
CSS类名支持中文命名的示例
2014/04/04 HTML / CSS
CSS3制作炫酷的下拉菜单及弹起式选单的实例分享
2016/05/17 HTML / CSS
理肤泉加拿大官网:La Roche-Posay加拿大
2018/07/06 全球购物
流行文化收藏品:Sideshow(DC漫画,星球大战,漫威)
2019/03/17 全球购物
Onzie官网:美国时尚瑜伽品牌
2019/08/21 全球购物
Java软件工程师综合面试题笔试题
2013/09/08 面试题
电焊工工作岗位职责
2014/02/06 职场文书
《小小竹排画中游》教学反思
2014/02/26 职场文书
比赛口号大全
2014/06/10 职场文书
社区党建工作汇报材料
2014/10/27 职场文书
老干部工作汇报材料
2014/10/28 职场文书
工作作风懒散检讨书
2014/10/29 职场文书
2016大学生暑期社会实践心得体会
2016/01/14 职场文书
Nginx优化服务之网页压缩的实现方法
2021/03/31 Servers
SQL Server 忘记密码以及重新添加新账号
2022/04/26 SQL Server