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触发器详解
Mar 10 Javascript
js setattribute批量设置css样式
Nov 26 Javascript
元素的内联事件处理函数的特殊作用域在各浏览器中存在差异
Jan 12 Javascript
jQuery下通过replace字符串替换实现大小图片切换
May 22 Javascript
用C/C++来实现 Node.js 的模块(二)
Sep 24 Javascript
Web表单提交之disabled问题js解决方法
Jan 13 Javascript
JS中script标签defer和async属性的区别详解
Aug 12 Javascript
浅谈js script标签中的预解析
Dec 30 Javascript
JS简单实现自定义右键菜单实例
May 31 Javascript
原生JS实现网页手机音乐播放器 歌词同步播放的示例
Feb 02 Javascript
深入理解JS中Number(),parseInt(),parseFloat()三者比较
Aug 24 Javascript
vue-cli3自动消除console.log()的调试信息方式
Oct 21 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
全国FM电台频率大全 - 9 上海市
2020/03/11 无线电
利用文件属性结合Session实现在线人数统计
2006/10/09 PHP
Windows Apache2.2.11及Php5.2.9-1的安装与配置方法
2009/06/08 PHP
PHP操作xml代码
2010/06/17 PHP
laravel5.4生成验证码的实例讲解
2017/08/05 PHP
PHP实现的字符串匹配算法示例【sunday算法】
2017/12/19 PHP
从Ajax到JQuery Ajax学习
2007/02/14 Javascript
JavaScript arguments 多参传值函数
2010/10/24 Javascript
js focus不起作用的解决方法(主要是因为dom元素是否加载完成)
2010/11/05 Javascript
window.opener用法和用途实例介绍
2013/08/19 Javascript
Backbone.js 0.9.2 源码注释中文翻译版
2015/06/25 Javascript
JS将滑动门改为选项卡(需鼠标点击)的实现方法
2015/09/27 Javascript
Bootstrap每天必学之导航
2015/11/26 Javascript
javascript中this指向详解
2016/04/23 Javascript
JS从一组数据中找到指定的单条数据的方法
2016/06/02 Javascript
JavaScript注册时密码强度校验代码
2017/06/30 Javascript
微信小程序滚动Tab实现左右可滑动切换
2017/08/17 Javascript
使用JavaScript计算前一天和后一天的思路详解
2019/12/20 Javascript
详解vite+ts快速搭建vue3项目以及介绍相关特性
2021/02/25 Vue.js
[01:14]3.19DOTA2发布会 三代刀塔人第二代
2014/03/25 DOTA
手把手教你python实现SVM算法
2017/12/27 Python
用十张图详解TensorFlow数据读取机制(附代码)
2018/02/06 Python
python numpy 部分排序 寻找最大的前几个数的方法
2018/06/27 Python
django 自定义filter 判断if var in list的例子
2019/08/20 Python
python修改文件内容的3种方法详解
2019/11/15 Python
解决import tensorflow as tf 出错的原因
2020/04/16 Python
英国灯具和灯泡网上商店:Lights.co.uk
2018/02/02 全球购物
全球500多个机场的接送服务:Suntransfers
2019/06/03 全球购物
通用C#笔试题附答案
2016/11/26 面试题
大学生个人总结的自我评价
2013/10/05 职场文书
2014年大学生党课心得体会范文
2014/03/29 职场文书
会议接待欢迎标语
2014/10/08 职场文书
有关三国演义的读书笔记
2015/06/25 职场文书
幼儿园中班教学反思
2016/03/03 职场文书
解析redis hash应用场景和常用命令
2021/08/04 Redis
Python+Selenium自动化环境搭建与操作基础详解
2022/03/13 Python