JavaScript对象创建模式实例汇总


Posted in Javascript onOctober 03, 2016

本文实例总结了JavaScript对象创建模式。分享给大家供大家参考,具体如下:

在JavaScript中创建对象是很容易的,可以使用对象字面量或者构造函数。常用的创建对象的模式有以下几种:

一. 工厂模式

工厂模式抽象了具体对象的过程,用函数来封装以特ing接口创建对象的细节。
如下:

function createAnimal(name, age) {
  var o = new Object();
  o.name = name;
  o.age = age;
  o.sayName = function() {
    alert(this.name);
  }
  return o;
}
var cat = createAnimal("cat", 12);
var dog = createAnimal("dog", 3);

工厂模式虽然解决了创建多个相似兑现过的问题,但是却没有解决对象识别的问题。

二. 构造函数模式

构造函数模式可以创建特定类型的对象。

function Animal(name, age) {
  this.name = name;
  this.age = age;
  this.sayName = function() {
    alert(this.name);
  }
}
var cat = new Animal("cat", 12);
var dog = new Animal("dog", 3);

可以使用对象的constructor属性或instanceof操作符来标识对象类型。

cat.constructor == Animal // true
cat instanceof Animal // true

三. 原型模式

每个函数都有一个prototype(原型)属性。这个属性是一个指针,指向一个对象,而这个对象的用途是包含可以由特定类型的所有实例共享的属性和方法。

使用原型对象的好处是,可以让所有对象实例共享它所包含的属性和方法。

function Animal() {}
Animal.prototype.name = "animal";
Animal.prototype.age = 1;
Animal.prototype.sayName = function() {
  alert(this.name);
}
var test1 = new Animal();
test1.sayName(); // "animal"
var test2 = new Animal();
test2.sayName(); // "animal"
alert(test1.sayName === test2.sayName); // true

或者:

function Animal() {}
Animal.prototype = {
  constructor: Animal,
  name: "animal",
  age: 1,
  sayName: function() {
    alert(this.name);
  }
};

原型中所有属性是被很多实例共享的,通过在实例上添加一个同名属性,可以隐藏原型中的对应属性。但是,对于包含引用类型值的属性来说,问题就比较明显了,如下:

function Animal() {}
Animal.prototype = {
  constructor: Animal,
  name: "animal",
  age: 1,
  hobbies: ["dance", "sing", "play"],
  sayName: function() {
    alert(this.name);
  }
};
var cat = new Animal();
var dog = new Animal();
cat.hobbies.push("sleep");
alert(cat.hobbies); // "dance", "sing", "play", "sleep"
alert(dog.hobbies); // "dance", "sing", "play", "sleep"
alert(cat.hobbies === dog.hobbies); // true

四. 组合使用构造函数模式和原型模式

function Animal(name, age) {
  this.name = "animal";
  this.age = 1;
  this.hobbies = ["dance", "sing", "play"];
}
Animal.prototype = {
  constructor: Animal,
  sayName: function() {
    alert(this.name);
  }
};
var cat = new Animal("cat", 2);
var dog = new Animal("dog", 3);
cat.hobbies.push("sleep");
alert(cat.hobbies); // "dance", "sing", "play", "sleep"
alert(dog.hobbies); // "dance", "sing", "play"
alert(cat.hobbies === dog.hobbies); // false
alert(cat.sayName === dog.sayName); // true

五. 动态原型模式

function Animal(name, age) {
  this.name = name;
  this.age = age;
  if(typeof this.sayName != "function") {
    Animal.prototype.sayName = function() {
      alert(this.name);
    }
  }
}
var cat = new Animal("cat", 12);
cat.sayName(); // "cat"

使用动态原型模式时,不能使用对象字面量重写原型。如果在已经创建了实例的情况下重写原型,那么就会切断现有实例与新原型之间的联系。

六. 寄生构造函数模式

寄生构造函数模式的基本思想是创建一个函数,该函数的作用仅仅是封装创建对象的代码,然后再返回新创建的对象。

从表面上看,这个函数很像典型的构造函数。除了使用new操作符之外,这个模式跟工厂模式长得一模一样。构造函数在不返回值的情况下,默认会返回新对象实例。而通过在构造函数的末尾添加一个return语句,可以重写调用构造函数时返回的值。

function Animal(name, age) {
  var o = new Object();
  o.name = name;
  o.age = age;
  o.sayName = function() {
    alert(this.name);
  }
  return o;
}
var cat = new Animal("cat", 12);
cat.sayName(); // "cat"

由于返回的对象与构造函数或构造函数的原型之间没有什么关系,因此不能依赖instanceof操作符来确定对象类型。

建议在可以使用其他模式的情况下,不能使用这种模式。

七. 稳妥构造函数模式

稳妥构造函数模式与寄生构造函数模式类似,但有两点不同:

一是新创建对象的实例方法不引用this;

二是不适用new操作符调用构造函数。

function Animal(name, age) {
  var o = new Object();
  o.name = name;
  o.age = age;
  var msg = "Hello, I'm ";
  o.sayName = function() {
    alert(msg + this.name);
  }
  return o;
}
var cat = new Animal("cat", 12);
cat.sayName(); // "Hello, I'm cat"

稳妥构造函数模式适合在某些安全执行环境。

更多关于JavaScript相关内容可查看本站专题:《javascript面向对象入门教程》、《JavaScript中json操作技巧总结》、《JavaScript切换特效与技巧总结》、《JavaScript查找算法技巧总结》、《JavaScript动画特效与技巧汇总》、《JavaScript错误与调试技巧总结》、《JavaScript数据结构与算法技巧总结》、《JavaScript遍历算法与技巧总结》及《JavaScript数学运算用法总结》

希望本文所述对大家JavaScript程序设计有所帮助。

Javascript 相关文章推荐
asp.net+js 实现无刷新上传解析csv文件的代码
May 17 Javascript
网站页面自动跳转实现方法PHP、JSP(下)
Aug 01 Javascript
js优化针对IE6.0起作用(详细整理)
Dec 25 Javascript
JavaScript实现多维数组的方法
Nov 20 Javascript
js判断浏览器版本以及浏览器内核的方法
Jan 20 Javascript
JavaScript Sort 的一个错误用法示例
Mar 20 Javascript
JavaScript利用正则表达式替换字符串中的内容
Dec 12 Javascript
vue中axios解决跨域问题和拦截器的使用方法
Mar 07 Javascript
Angularjs之如何在跨域请求中传输Cookie的方法
Jun 01 Javascript
微信小程序--获取用户地理位置名称(无须用户授权)的方法
Apr 29 Javascript
vue实现带过渡效果的下拉菜单功能
Feb 19 Javascript
Vue项目移动端滚动穿透问题的实现
May 19 Javascript
js实现的光标位置工具函数示例
Oct 03 #Javascript
js获取腾讯视频ID的方法
Oct 03 #Javascript
关于js二维数组和多维数组的定义声明(详解)
Oct 02 #Javascript
微信小程序 navigation API实例详解
Oct 02 #Javascript
微信小程序 获取设备信息 API实例详解
Oct 02 #Javascript
微信小程序 location API实例详解
Oct 02 #Javascript
微信小程序 Storage API实例详解
Oct 02 #Javascript
You might like
PHP中break及continue两个流程控制指令区别分析
2011/04/18 PHP
dedecms集成财付通支付接口
2014/12/28 PHP
php的sso单点登录实现方法
2015/01/08 PHP
[原创]php求圆周率的简单实现方法
2016/05/30 PHP
php中this关键字用法分析
2016/12/07 PHP
使用jQuery内容过滤选择器选择元素实例讲解
2013/04/18 Javascript
A标签中通过href和onclick传递的this对象实现思路
2013/04/19 Javascript
禁用页面部分JavaScript方法的具体实现
2013/07/31 Javascript
js数组的操作指南
2014/12/28 Javascript
使用ngView配合AngularJS应用实现动画效果的方法
2015/06/19 Javascript
Jquery获取第一个子元素简单实例
2016/06/02 Javascript
可输入文字查找ajax下拉框控件 ComBox的实现方法
2016/10/25 Javascript
微信小程序 九宫格实例代码
2017/01/21 Javascript
JavaScript 栈的详解及实例代码
2017/01/22 Javascript
详解基于vue的服务端渲染框架NUXT
2018/06/20 Javascript
详解ES6 Fetch API HTTP请求实用指南
2018/11/14 Javascript
对layer弹出框中icon数字参数的说明介绍
2019/09/04 Javascript
[01:10]DOTA2次级职业联赛 - EP战队宣传片
2014/12/01 DOTA
详解Python中for循环的使用
2015/04/14 Python
在Linux中通过Python脚本访问mdb数据库的方法
2015/05/06 Python
Python os模块学习笔记
2015/06/21 Python
Python+matplotlib绘制不同大小和颜色散点图实例
2018/01/19 Python
Python标准库笔记struct模块的使用
2018/02/22 Python
Python 二叉树的层序建立与三种遍历实现详解
2019/07/29 Python
详谈tensorflow gfile文件的用法
2020/02/05 Python
使用Python获取当前工作目录和执行命令的位置
2020/03/09 Python
django xadmin中form_layout添加字段显示方式
2020/03/30 Python
python爬虫请求头设置代码
2020/07/28 Python
Python下载网易云歌单歌曲的示例代码
2020/08/12 Python
业务员岗位职责
2013/11/16 职场文书
一名女生的自荐信
2013/12/08 职场文书
班级活动总结格式
2014/08/30 职场文书
简易离婚协议书范本
2014/10/24 职场文书
党员群众路线学习心得体会
2014/11/04 职场文书
2014年惩防体系建设工作总结
2014/12/01 职场文书
班干部学习委员竞选稿
2015/11/20 职场文书