JavaScript设计模式之原型模式分析【ES5与ES6】


Posted in Javascript onJuly 26, 2018

本文实例讲述了JavaScript设计模式之原型模式。分享给大家供大家参考,具体如下:

从设计模式的角度讲,原型模式是用于创建对象的一种模式,若需要创建一个对象,一种方法是先指定其类型,然后通过类来创建这个对象,另一种方法是通过原型来创建,不必关心对象的具体类型,而是找到一个对象,然后通过克隆来创建一个一模一样的对象。

ES5提供了Object.create(obj)方法来克隆对象,在不支持Object.create(obj)方法的浏览器中,可以使用以下代码:

Object.create = Object.create || function(obj) {
  function Func() {};
  Func.prototype = obj;
  return new Func();
}

一、JavaScript中的原型继承:

1. 大部分的数据都是对象;

JavaScript有两种类型机制:基本类型和对象类型。基本类型包括undefinednumberbooleanstringfunctionobject

JavaScript设计者的本意在于,除了undefined,一切都应该是对象,为了实现这一目标,number、boolean、string这几种基本数据类型通过对应的包装类Number、Boolean、String来变成对象类型数据。

JavaScript中的根对象是Object.prototype对象,Object.prototype对象是一个空的对象。JavaScript的每个对象,实际上都是从Object.prototype对象克隆而来的,Object.prototype对象就是它们的原型。

ES5提供了getPrototypeOf来查看对象的原型,Object.getPrototypeOf(任何对象) == Object.prototype都会返回true。

2. 要得到一个对象,不是通过实例化类,而是找到一个对象作为原型并克隆它;

JavaScript没有类的概念,new运算符后面的不是类,而是构造器。当使用new运算符来创建对象时,实际上也是先克隆Object.prototype对象,再进行一些额外操作的过程。

3. 对象会记住它的原型;

其实不能说对象有原型,而只能说对象的构造器有原型。JavaScript给对象提供了一个名为__proto__属性,默认指向它的构造器的原型,__proto__属性是对象与构造器的原型联系起来的纽带,如:person.__proto__ == Person.prototype

4. 若对象无法响应某个请求,它会把该请求委托给它自己的原型。

这是原型继承的精髓,当一个对象无法响应某个请求时,会顺着原型链把请求传递下去,直到遇到一个可以处理该请求的对象为止。但是,原型链并不是无限长的,只会查找到Object.prototype对象为止,由于Object.prototype的原型是null,因此请求无法找到可以处理的对象,返回undefined

二、原型继承的未来

使用Object.create来实现原型继承似乎更能体现原型模式的精髓,但是,通过Object.create创建对象的效率并不高,通常要比通过构造函数创建对象慢。

ES6带来了新的Class语法,这让JavaScript看起来像是一门基于类的语言,但背后仍然是通过原型机制来创建对象。

class Person {
  constuctor(name) {
    this.name = name;
  }
  getName() {
    return this.name;
  }
}
class Student extends Person {
  constuctor(name) {
    super(name);
  }
  sayHello() {
    alert(“Hello”);
  }
}
var student = new Student(“Alice”);
student.sayHello();

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

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

Javascript 相关文章推荐
html数组字符串拼接的最快方法
Sep 16 Javascript
Javascript 判断Flash是否加载完成的代码
Apr 12 Javascript
iframe 父窗口和子窗口相互的调用方法集锦
Dec 15 Javascript
把jquery 的dialog和ztree结合实现步骤
Aug 02 Javascript
JQuery操作三大控件(下拉,单选,复选)的方法
Aug 06 Javascript
CSS+JS实现点击文字弹出定时自动关闭DIV层菜单的方法
May 12 Javascript
JavaScript中用于四舍五入的Math.round()方法讲解
Jun 15 Javascript
基于javascript实现精确到毫秒的倒计时限时抢购
Apr 17 Javascript
基于jQuery的AJAX和JSON实现纯html数据模板
Aug 09 Javascript
jQuery封装animate.css的实例
Jan 04 jQuery
vue-cli项目修改文件热重载失效的解决方法
Sep 19 Javascript
微信小程序开发中var that =this的用法详解
Jan 18 Javascript
如何把vuejs打包出来的文件整合到springboot里
Jul 26 #Javascript
JavaScript中变量提升与函数提升经典实例分析
Jul 26 #Javascript
基于Vue实现微信小程序的图文编辑器
Jul 25 #Javascript
详解ECMAScript typeof用法
Jul 25 #Javascript
微信小程序动态生成二维码的实现代码
Jul 25 #Javascript
JavaScript设计模式之装饰者模式定义与应用示例
Jul 25 #Javascript
JavaScript实现的文本框placeholder提示文字功能示例
Jul 25 #Javascript
You might like
全国FM电台频率大全 - 19 广东省
2020/03/11 无线电
PHP array_flip() 删除重复数组元素专用函数
2010/05/16 PHP
深入浅析php中sprintf与printf函数的用法及区别
2016/01/08 PHP
PHP进程通信基础之信号量与共享内存通信
2017/02/19 PHP
跟着Jquery API学Jquery之一 选择器
2010/04/07 Javascript
自己动手制作jquery插件之自动添加删除行的实现
2011/10/13 Javascript
键盘上一张下一张兼容IE/google/firefox等浏览器
2014/01/28 Javascript
jQuery函数的第二个参数获取指定上下文中的DOM元素
2014/05/19 Javascript
jQuery和AngularJS的区别浅析
2015/01/29 Javascript
javascript实现按回车键切换焦点
2015/02/09 Javascript
JS实现从连接中获取youtube的key实例
2015/07/02 Javascript
GitHub上一些实用的JavaScript的文件压缩解压缩库推荐
2016/03/13 Javascript
bootstrap轮播模板使用方法详解
2017/11/17 Javascript
jQuery实现的简单获取索引功能示例
2018/06/04 jQuery
中级前端工程师必须要掌握的27个JavaScript 技巧(干货总结)
2019/09/23 Javascript
原生js实现贪食蛇小游戏的思路详解
2019/11/26 Javascript
解决Echarts2竖直datazoom滑动后显示数据不全的问题
2020/07/20 Javascript
纯js+css实现在线时钟
2020/08/18 Javascript
[06:49]2018DOTA2国际邀请赛寻真——VirtusPro傲视群雄
2018/08/12 DOTA
Python 专题二 条件语句和循环语句的基础知识
2017/03/19 Python
python中redis查看剩余过期时间及用正则通配符批量删除key的方法
2018/07/30 Python
python使用pipeline批量读写redis的方法
2019/02/18 Python
python隐藏类中属性的3种实现方法
2019/12/19 Python
详解Python3.8+PyQt5+pyqt5-tools+Pycharm配置详细教程
2020/11/02 Python
阿迪达斯墨西哥官方网站:adidas墨西哥
2017/11/03 全球购物
为有想象力的人提供的生活方式商店:Firebox
2018/06/04 全球购物
德国BA保镖药房中文网:Bodyguard Apotheke
2021/03/09 全球购物
几道Web/Ajax的面试题
2016/11/05 面试题
咖啡店自主创业商业计划书
2014/01/22 职场文书
文明倡议书范文
2014/04/15 职场文书
创建青年文明号材料
2014/05/09 职场文书
物理教育专业求职信
2014/06/25 职场文书
升学宴演讲稿
2014/09/01 职场文书
信息技术远程培训心得体会
2016/01/09 职场文书
导游词之蜀山胜景瓦屋山
2019/11/29 职场文书
数据库连接池
2021/04/06 MySQL