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 相关文章推荐
ExtJS PropertyGrid中使用Combobox选择值问题
Jun 13 Javascript
jquery中的on方法使用介绍
Dec 29 Javascript
jQuery禁用键盘后退屏蔽F5刷新及禁用右键单击
Jan 22 Javascript
基于BootStrap Metronic开发框架经验小结【六】对话框及提示框的处理和优化
May 12 Javascript
JS代码实现table数据分页效果
May 26 Javascript
JS小数转换为整数的方法分析
Jan 07 Javascript
jQuery EasyUI ProgressBar进度条组件
Feb 28 Javascript
基于JavaScript实现图片剪切效果
Mar 07 Javascript
动手写一个angular版本的Message组件的方法
Dec 16 Javascript
swiper自定义分页器使用方法详解
Sep 14 Javascript
JavaScript简单实现的仿微博留言功能示例
Jan 17 Javascript
基于jquery实现彩色投票进度条代码解析
Aug 26 jQuery
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二进制流 逐bit的低位在前算法(详解)
2013/06/13 PHP
使用php判断网页是否gzip压缩
2013/06/25 PHP
PHP 7的一些引人注目的新特性简单介绍
2015/11/08 PHP
thinkPHP中多维数组的遍历方法
2016/01/09 PHP
利用PHP绘图函数实现简单验证码功能的方法
2016/10/18 PHP
PHP给前端返回一个JSON对象的实例讲解
2018/05/31 PHP
Yii2框架加载css和js文件的方法分析
2019/05/25 PHP
TNC vs IO BO3 第一场2.13
2021/03/10 DOTA
jquery获取table中的某行全部td的内容方法
2013/03/08 Javascript
什么是cookie?js手动创建和存储cookie
2014/05/27 Javascript
js与jquery回车提交的方法
2015/02/03 Javascript
jQuery+css3动画属性制作猎豹浏览器宽屏banner焦点图
2015/03/16 Javascript
自定义刻度jQuery进度条及插件
2015/09/02 Javascript
JavaScript通过HTML的class来获取HTML元素的方法总结
2016/05/24 Javascript
canvas绘制一个常用的emoji表情
2017/03/30 Javascript
ReactJs设置css样式的方法
2017/06/08 Javascript
微信小程序dom操作的替代思路实例分析
2018/12/06 Javascript
bootstrap与pagehelper实现分页效果
2018/12/29 Javascript
JavaScript ES2019中的8个新特性详解
2019/02/20 Javascript
jquery更改元素属性attr()方法操作示例
2020/05/22 jQuery
JavaScript React如何修改默认端口号方法详解
2020/07/28 Javascript
js闭包和垃圾回收机制示例详解
2021/03/01 Javascript
Python的SQLAlchemy框架使用入门
2015/04/29 Python
Python socket编程实例详解
2015/05/27 Python
使用httplib模块来制作Python下HTTP客户端的方法
2015/06/19 Python
python3编写ThinkPHP命令执行Getshell的方法
2019/02/26 Python
python实现websocket的客户端压力测试
2019/06/25 Python
学python安装的软件总结
2019/10/12 Python
Django 项目布局方法(值得推荐)
2020/03/22 Python
python如何将图片转换素描画
2020/09/08 Python
班级安全教育实施方案
2014/02/23 职场文书
春季防火方案
2014/05/10 职场文书
晋江市委常委班子四风问题整改工作方案
2014/10/26 职场文书
女儿满月酒致辞
2015/07/29 职场文书
WordPress多语言翻译插件 - WPML使用教程
2021/04/01 PHP
PyCharm 配置SSH和SFTP连接远程服务器
2022/05/11 Python