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与flash交互通信基础教程
Aug 07 Javascript
JavaScript中document.forms[0]与getElementByName区别
Jan 21 Javascript
谈谈Jquery中的children find 的区别有哪些
Oct 19 Javascript
JavaScript、tab切换完整版(自动切换、鼠标移入停止、移开运行)
Jan 05 Javascript
JS不用正则验证输入的字符串是否为空(包含空格)的实现代码
Jun 14 Javascript
jquery实现文本框的禁用和启用
Dec 07 Javascript
jQuery EasyUI开发技巧总结
Sep 26 jQuery
详解JS模块导入导出
Dec 20 Javascript
Vue中mintui的field实现blur和focus事件的方法
Aug 25 Javascript
如何在vue里面优雅的解决跨域(路由冲突问题)
Jan 20 Javascript
vue + typescript + video.js实现 流媒体播放 视频监控功能
Jul 07 Javascript
Vue Element校验validate的实例
Sep 21 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对接java现实加签验签的实例
2016/11/25 PHP
关于PHP虚拟主机概念及如何选择稳定的PHP虚拟主机
2018/11/20 PHP
PHP的new static和new self的区别与使用
2019/11/27 PHP
显示、隐藏密码
2006/07/01 Javascript
node.js中的fs.utimes方法使用说明
2014/12/15 Javascript
Jquery实现的简单轮播效果【附实例】
2016/04/19 Javascript
JS中使用变量保存arguments对象的方法
2016/06/03 Javascript
JS如何判断json是否为空
2016/07/06 Javascript
jQuery向父辈遍历的简单方法
2016/09/18 Javascript
JS实现类似51job上的地区选择效果示例
2016/11/17 Javascript
js中的触发事件对象event.srcElement与event.target详解
2017/03/15 Javascript
canvas绘制一个常用的emoji表情
2017/03/30 Javascript
vue2.0 element-ui中el-select选择器无法显示选中的内容(解决方法)
2018/08/24 Javascript
JS解惑之Object中的key是有序的么
2019/05/06 Javascript
使用Vue 实现滑动验证码功能
2019/06/27 Javascript
uni-app使用countdown插件实现倒计时
2020/11/01 Javascript
python 测试实现方法
2008/12/24 Python
Python中list初始化方法示例
2016/09/18 Python
Python变量和数据类型详解
2017/02/15 Python
Python各类图像库的图片读写方式总结(推荐)
2018/02/23 Python
django 使用 request 获取浏览器发送的参数示例代码
2018/06/11 Python
Python 单元测试(unittest)的使用小结
2018/11/14 Python
对Python 简单串口收发GUI界面的实例详解
2019/06/12 Python
使用HTML5的表单验证的简单示例
2015/09/09 HTML / CSS
Web时代变迁及html5与html4的区别
2016/01/06 HTML / CSS
汽车检测与维修专业求职信
2013/10/30 职场文书
出国留学经济担保书
2014/04/01 职场文书
2014年初中班主任工作总结
2014/11/08 职场文书
2015年会计人员工作总结
2015/05/22 职场文书
校园开放日新闻稿
2015/07/17 职场文书
2015年度对口支援工作总结
2015/07/22 职场文书
导游词之永济鹳雀楼
2020/01/16 职场文书
Mysql效率优化定位较低sql的两种方式
2021/05/26 MySQL
如何利用pygame实现打飞机小游戏
2021/05/30 Python
《异世界四重奏》剧场版6月10日上映 PV视觉图原创角色发表
2022/03/20 日漫
Golang解析JSON对象
2022/04/30 Golang