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 相关文章推荐
JQuery 学习笔记 选择器之二
Jul 23 Javascript
JavaScript CSS 修改学习第四章 透明度设置
Feb 19 Javascript
js 通用订单代码
Dec 23 Javascript
Javascript添加监听与删除监听用法详解
Dec 19 Javascript
输入法的回车与消息发送快捷键回车的冲突解决方法
Aug 09 Javascript
javascript工厂模式和构造函数模式创建对象方法解析
Dec 30 Javascript
微信小程序 参数传递实例代码
Mar 20 Javascript
js学使用setTimeout实现轮循动画
Jul 17 Javascript
JS判断微信扫码的方法
Aug 07 Javascript
Vue实现购物车场景下的应用
Nov 27 Javascript
element-ui多文件上传的实现示例
Apr 10 Javascript
vue-cli脚手架打包静态资源请求出错的原因与解决
Jun 06 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绝对路径与相对路径之间关系的的分析
2010/03/03 PHP
php中修改浏览器的User-Agent来伪装你的浏览器和操作系统
2011/07/29 PHP
解析使用ThinkPHP应该掌握的调试手段
2013/06/20 PHP
奉献出一个封装的curl函数 便于调用(抓数据专用)
2013/07/22 PHP
php setcookie函数的参数说明及其用法
2014/04/20 PHP
3款值得推荐的微信开发开源框架
2014/10/28 PHP
微信公众号点击菜单即可打开并登录微站的实现方法
2014/11/14 PHP
PHP函数extension_loaded()用法实例
2015/01/19 PHP
CentOS下PHP7的编译安装及MySQL的支持和一些常见问题的解决办法
2015/12/17 PHP
PHP实现上传多文件示例代码
2017/02/20 PHP
jQuery使用手册之二 DOM操作
2007/03/24 Javascript
使用javascript获取flash加载的百分比的实现代码
2011/05/25 Javascript
20个非常棒的 jQuery 幻灯片插件和教程分享
2011/08/23 Javascript
jQuery EasyUI API 中文文档 - ComboTree组合树
2011/10/11 Javascript
js判断undefined类型示例代码
2014/02/10 Javascript
Javascript中数组sort和reverse用法分析
2014/12/30 Javascript
jQuery实现3D文字特效的方法
2015/03/10 Javascript
jQuery实现精美的多级下拉菜单特效
2015/03/14 Javascript
JS延时提示框实现方法详解
2015/11/26 Javascript
vue过渡和animate.css结合使用详解
2017/06/14 Javascript
简单易扩展可控性强的Jquery转盘抽奖程序
2019/03/16 jQuery
js实现漂亮的星空背景
2019/11/01 Javascript
win10环境下python3.5安装步骤图文教程
2017/02/03 Python
python算法演练_One Rule 算法(详解)
2017/05/17 Python
python实现Floyd算法
2018/01/03 Python
解决Python spyder显示不全df列和行的问题
2020/04/20 Python
Python自动巡检H3C交换机实现过程解析
2020/08/14 Python
皮姆斯勒语言学习:Pimsleur Language Programs
2018/06/30 全球购物
芬兰设计商店美国:Finnish Design Shop US
2019/03/25 全球购物
Hotels.com拉丁美洲:从豪华酒店到经济型酒店的预定优惠和折扣
2019/12/09 全球购物
医学专业个人求职自荐信格式
2013/09/23 职场文书
幼儿园中班下学期评语
2014/04/18 职场文书
2014年十一国庆节爱国演讲稿
2014/09/23 职场文书
房贷收入证明范本
2015/06/12 职场文书
2019年最新版见习人员管理制度!
2019/07/08 职场文书
Java 在线考试云平台的实现
2021/11/23 Java/Android