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 相关文章推荐
javascript 支持ie和firefox杰奇翻页函数
Jul 22 Javascript
javascript使用eval或者new Function进行语法检查
Oct 16 Javascript
jQuery判断checkbox是否选中的3种方法
Aug 12 Javascript
Javascript验证用户输入URL地址是否为空及格式是否正确
Oct 09 Javascript
详解JavaScript编程中的数组结构
Oct 24 Javascript
jQuery插件之jQuery.Form.js用法实例分析(附demo示例源码)
Jan 04 Javascript
Highcharts 多个Y轴动态刷新数据的实现代码
May 28 Javascript
jQuery处理XML文件的几种方法
Jun 14 Javascript
javascript动画之磁性吸附效果篇
Dec 09 Javascript
Vue 样式绑定的实现方法
Jan 15 Javascript
如何在项目中使用log4.js的方法步骤
Jul 16 Javascript
JavaScript变量Dom对象的所有属性
Apr 30 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
php面向对象全攻略 (十二) 抽象方法和抽象类
2009/09/30 PHP
PHP 一个随机字符串生成代码
2010/05/26 PHP
windows下配置apache+php+mysql时出现问题的处理方法
2014/06/20 PHP
php获取开始与结束日期之间所有日期的方法
2016/11/29 PHP
javascript 变量作用域 代码分析
2009/06/26 Javascript
jquery 弹出登录窗口实现代码
2009/12/24 Javascript
jquery插件实现鼠标经过图片右侧显示大图的效果(类似淘宝)
2013/02/04 Javascript
可自定义速度的js图片无缝滚动示例分享
2014/01/20 Javascript
我的Node.js学习之路(一)
2014/07/06 Javascript
js防止DIV布局滚动时闪动的解决方法
2014/10/30 Javascript
TypeScript Type Innference(类型判断)
2016/03/10 Javascript
vue.js绑定class和style样式(6)
2016/12/09 Javascript
配置nodejs环境的方法
2017/05/13 NodeJs
React 项目迁移 Webpack Babel7的实现
2018/09/12 Javascript
详解vue beforeRouteEnter 异步获取数据给实例问题
2019/08/09 Javascript
jQuery轮播图功能制作方法详解
2019/12/03 jQuery
JavaScript常用工具函数汇总(浏览器环境)
2020/09/17 Javascript
[10:18]2018DOTA2国际邀请赛寻真——Fnatic能否笑到最后?
2018/08/14 DOTA
python获取文件版本信息、公司名和产品名的方法
2014/10/05 Python
一个基于flask的web应用诞生 组织结构调整(7)
2017/04/11 Python
基于ID3决策树算法的实现(Python版)
2017/05/31 Python
python mac下安装虚拟环境的图文教程
2019/04/12 Python
Python使用dict.fromkeys()快速生成一个字典示例
2019/04/24 Python
深入了解Python 方法之类方法 & 静态方法
2020/08/17 Python
Python2及Python3如何实现兼容切换
2020/09/01 Python
Python tkinter制作单机五子棋游戏
2020/09/14 Python
html5页面结构_动力节点Java学院整理
2017/07/10 HTML / CSS
味多美官网:蛋糕订购,100%使用天然奶油
2017/11/10 全球购物
Kivari官网:在线购买波西米亚服装
2018/10/29 全球购物
Audible英国:有声读物,30天免费试用
2019/10/16 全球购物
统计学专业毕业生的自我评价分享
2013/11/28 职场文书
琅琊山导游词
2015/02/05 职场文书
幼儿园辞职信
2015/05/13 职场文书
拔河比赛新闻稿
2015/07/17 职场文书
css背景和边框标签实例详解
2021/05/21 HTML / CSS
MySQL普通表如何转换成分区表
2022/05/30 MySQL