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 相关文章推荐
web网页按比例显示图片实现原理及js代码
Aug 09 Javascript
jQuery遍历对象、数组、集合实例
Nov 08 Javascript
js获取字符串最后一位方法汇总
Nov 13 Javascript
js实现背景图自适应窗口大小
Jan 10 Javascript
javascript 使用正则test( )第一次是 true,第二次是false
Feb 22 Javascript
layer弹出层 iframe层去掉滚动条的实例代码
Aug 17 Javascript
浅谈webpack4.x 入门(一篇足矣)
Sep 05 Javascript
详解vue 2.6 中 slot 的新用法
Jul 09 Javascript
JavaScript和TypeScript中的void的具体使用
Sep 12 Javascript
vue+webpack dev本地调试全局样式引用失效的解决方案
Nov 12 Javascript
JS代码检查工具ESLint介绍与使用方法
Feb 04 Javascript
VUE递归树形实现多级列表
Jul 15 Vue.js
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
ThinkPHP3.1新特性之内容解析输出详解
2014/06/19 PHP
Moment.js 不容错过的超棒Javascript日期处理类库
2012/04/15 Javascript
Jquery 模板数据绑定插件的使用方法详解
2013/07/08 Javascript
Javascript玩转继承(三)
2014/05/08 Javascript
jQuery实现的原图对比窗帘效果
2014/06/15 Javascript
jquery.cookie.js使用指南
2015/01/05 Javascript
jQuery中toggle()函数的使用实例
2015/04/17 Javascript
js实现使用鼠标拖拽切换图片的方法
2015/05/04 Javascript
jQuery实现的网页竖向菜单效果代码
2015/08/26 Javascript
jquery中ajax跨域方法实例分析
2015/12/18 Javascript
JS实现部分HTML固定页面顶部随屏滚动效果
2015/12/24 Javascript
jQuery Ajax全解析
2017/02/13 Javascript
Nodejs多站点切换Htpps协议详解及简单实例
2017/02/23 NodeJs
浅谈Webpack自动化构建实践指南
2017/12/18 Javascript
nodejs基于express实现文件上传的方法
2018/03/19 NodeJs
学习JS中的DOM节点以及操作
2018/04/30 Javascript
详解mpvue开发小程序小总结
2018/07/25 Javascript
jquery图片预览插件实现方法详解
2019/07/18 jQuery
vue 导航内容设置选中状态样式的例子
2019/11/01 Javascript
解决removeEventListener 无法清除监听的问题
2020/10/30 Javascript
python实现将英文单词表示的数字转换成阿拉伯数字的方法
2015/07/02 Python
Python循环语句中else的用法总结
2016/09/11 Python
Python常见加密模块用法分析【MD5,sha,crypt模块】
2017/05/24 Python
用Python生成HTML表格的方法示例
2020/03/06 Python
django 前端页面如何实现显示前N条数据
2020/03/16 Python
python dict如何定义
2020/09/02 Python
Python+Opencv实现把图片、视频互转的示例
2020/12/17 Python
html2canvas截图空白问题的解决
2020/03/24 HTML / CSS
俄罗斯游戏商店:Buka
2020/03/01 全球购物
几个数据库方面的面试题
2016/07/01 面试题
教育学专业毕业生的自我评价
2013/11/21 职场文书
实习老师离校感言
2014/02/03 职场文书
最新奶茶店创业计划书范文
2014/02/08 职场文书
民事和解协议书格式
2014/11/29 职场文书
保外就医申请书范文
2015/08/06 职场文书
Python编写可视化界面的全过程(Python+PyCharm+PyQt)
2021/05/17 Python