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 相关文章推荐
通过Mootools 1.2来操纵HTML DOM元素
Sep 15 Javascript
关于JS字符串函数String.replace()
Apr 07 Javascript
JS+flash实现chrome和ie浏览器下同时可以复制粘贴
Sep 22 Javascript
使用变量动态设置js的属性名
Oct 19 Javascript
Css3制作变形与动画效果
Jul 24 Javascript
jQuery实现的经典竖向伸缩菜单效果代码
Sep 24 Javascript
JavaScript数组去重的五种方法
Nov 05 Javascript
详解Vue 事件驱动和依赖追踪
Apr 22 Javascript
详解Vue2.0组件的继承与扩展
Nov 23 Javascript
node 标准输入流和输出流代码实例
Sep 19 Javascript
js实现图片上传即时显示效果
Sep 30 Javascript
Vue实现跑马灯效果
May 25 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中实现图片的锐化
2006/10/09 PHP
PHP数据流应用的一个简单实例
2012/09/14 PHP
解析thinkphp中的导入文件标签
2013/06/20 PHP
解决出现SoapFault (looks like we got no XML document)的问题
2017/06/24 PHP
dess中一个简单的多路委托的实现
2010/07/20 Javascript
JavaScript中函数声明优先于变量声明的实例分析
2012/03/01 Javascript
解析javascript 浏览器关闭事件
2013/07/08 Javascript
jQuery异步加载数据并添加事件示例
2014/08/24 Javascript
理解js回收机制通俗易懂版
2016/02/29 Javascript
详解vue-router 路由元信息
2017/09/13 Javascript
解决vue接口数据赋值给data没有反应的问题
2018/08/27 Javascript
微信小程序 image组件遇到的问题
2019/05/28 Javascript
JS去除字符串最后的逗号实例分析【四种方法】
2019/06/20 Javascript
jquery插件开发模式实例详解
2019/07/20 jQuery
VUE实现强制渲染,强制更新
2019/10/29 Javascript
详解jQuery中的prop()使用方法
2020/01/05 jQuery
JavaScript如何判断对象有某属性
2020/07/03 Javascript
vue实现的多页面项目如何优化打包的步骤详解
2020/07/19 Javascript
鸿蒙系统中的 JS 开发框架
2020/09/18 Javascript
一篇超完整的Vue新手入门指导教程
2020/11/18 Vue.js
python共享引用(多个变量引用)示例代码
2013/12/04 Python
Python中enumerate函数代码解析
2017/10/31 Python
python利用rsa库做公钥解密的方法教程
2017/12/10 Python
python3.6根据m3u8下载mp4视频
2019/06/17 Python
Python+Appium实现自动化清理微信僵尸好友的方法
2021/02/04 Python
纯CSS3发光分享按钮的实现教程
2014/09/06 HTML / CSS
HTML5 Web缓存和运用程序缓存(cookie,session)
2018/01/11 HTML / CSS
美国手工艺品市场的领导者:Annie’s
2019/04/04 全球购物
如何写一个Java类既可以用作applet也可以用作java应用
2016/01/18 面试题
机电专业大学生求职信
2013/10/04 职场文书
高一自我鉴定
2013/12/17 职场文书
旷课检讨书1000字
2014/02/14 职场文书
师德自我剖析材料范文
2014/10/06 职场文书
2015年安全生产目标责任书
2015/01/29 职场文书
放假通知格式
2015/04/14 职场文书
2016简历自荐信优秀范文
2016/01/29 职场文书