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 相关文章推荐
Javascript - HTML的request类
Jul 15 Javascript
JavaScript高级程序设计 阅读笔记(二十一) JavaScript中的XML
Sep 14 Javascript
javascript的创建多行字符串的7种方法
Apr 29 Javascript
js控制div弹出层实现方法
May 11 Javascript
自定义刻度jQuery进度条及插件
Sep 02 Javascript
全面理解闭包机制
Jul 11 Javascript
Angularjs处理页面闪烁的解决方法
Mar 09 Javascript
微信小程序实现星星评价效果
Nov 02 Javascript
layui问题之自动滚动二级iframe页面到指定位置的方法
Sep 18 Javascript
微信小程序 导入图标实现过程详解
Oct 11 Javascript
Vue路由管理器Vue-router的使用方法详解
Feb 05 Javascript
vue如何在用户要关闭当前网页时弹出提示的实现
May 31 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遍历数组的方法分享
2012/03/22 PHP
分享php多功能图片处理类
2016/05/15 PHP
关于Jquery操作Cookie取值错误的解决方法
2013/08/26 Javascript
原生js实现改变随意改变div属性style的名称和值的结果
2013/09/26 Javascript
node.js中的dns.getServers方法使用说明
2014/12/08 Javascript
jquery移动节点实例
2015/01/14 Javascript
javascript绘制漂亮的心型线效果完整实例
2016/02/02 Javascript
Bootstrap基本组件学习笔记之导航(10)
2016/12/07 Javascript
EditPlus中的正则表达式 实战(4)
2016/12/15 Javascript
Angular.JS中的this指向详解
2017/05/17 Javascript
JS检测window.open打开的窗口是否关闭
2017/06/25 Javascript
微信二次分享报错invalid signature问题及解决方法
2019/04/01 Javascript
jQuery创建折叠式菜单
2019/06/15 jQuery
Vue图片浏览组件v-viewer用法分析【支持旋转、缩放、翻转等操作】
2019/11/04 Javascript
vue css 引入asstes中的图片无法显示的四种解决方法
2020/03/16 Javascript
Mac下Supervisor进程监控管理工具的安装与配置
2014/12/16 Python
Python递归遍历列表及输出的实现方法
2015/05/19 Python
python 脚本生成随机 字母 + 数字密码功能
2018/05/26 Python
python操作excel的方法
2018/08/16 Python
Python面向对象程序设计类变量与成员变量、类方法与成员方法用法分析
2019/04/12 Python
python关于矩阵重复赋值覆盖问题的解决方法
2019/07/19 Python
python集合删除多种方法详解
2020/02/10 Python
Python使用扩展库pywin32实现批量文档打印实例
2020/04/09 Python
详解如何在PyCharm控制台中输出彩色文字和背景
2020/08/17 Python
利用python批量爬取百度任意类别的图片的实现方法
2020/10/07 Python
原生 JS+CSS+HTML 实现时序图的方法
2019/07/31 HTML / CSS
Converse匡威法国官网:美国著名帆布鞋品牌
2018/12/05 全球购物
英国在线药房和在线药剂师:Chemist 4 U
2020/01/05 全球购物
Order by的几种用法
2013/06/16 面试题
一些.net面试题
2014/10/06 面试题
教师求职自荐信
2014/03/09 职场文书
2014年公路养护工作总结
2014/12/04 职场文书
golang gopm get -g -v 无法获取第三方库的解决方案
2021/05/05 Golang
浅谈如何提高PHP代码质量之端到端集成测试
2021/05/28 PHP
解决linux下redis数据库overcommit_memory问题
2022/02/24 Redis
关于EntityWrapper的in用法
2022/03/22 Java/Android