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 相关文章推荐
用Javascript 和 CSS 实现脚注(Footnote)效果
Sep 09 Javascript
JS获取url链接字符串 location.href
Dec 23 Javascript
微信小程序实现图片预加载组件
Jan 18 Javascript
JS实现JSON.stringify的实例代码讲解
Feb 07 Javascript
实例解析js中try、catch、finally的执行规则
Feb 24 Javascript
JavaScript队列的应用实例详解【经典数据结构】
Apr 12 Javascript
vue watch普通监听和深度监听实例详解(数组和对象)
Aug 16 Javascript
微信小程序学习笔记之目录结构、基本配置图文详解
Mar 28 Javascript
今天,小程序正式支持 SVG
Apr 20 Javascript
vue中node_modules中第三方模块的修改使用详解
May 31 Javascript
详解微信小程序自定义组件的实现及数据交互
Jul 22 Javascript
node.JS二进制操作模块buffer对象使用方法详解
Feb 06 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
介绍php设计模式中的工厂模式
2008/06/12 PHP
php中理解print EOT分界符和echo EOT的用法区别小结
2010/02/21 PHP
从性能方面考虑PHP下载远程文件的3种方法
2015/12/29 PHP
PHP文件上传之多文件上传的实现思路
2016/01/27 PHP
php 修改上传文件大小限制实例详解
2016/10/23 PHP
yii框架结合charjs统计上一年与当前年数据的方法示例
2020/04/04 PHP
js判断一个元素是否为另一个元素的子元素的代码
2012/03/21 Javascript
js判断undefined变量类型使用typeof
2013/06/03 Javascript
css结合js制作下拉菜单示例代码
2014/02/27 Javascript
Node.js开发者必须了解的4个JS要点
2016/02/21 Javascript
javaScript给元素添加多个class的简单实现
2016/07/20 Javascript
详解基于javascript实现的苹果系统底部菜单
2016/12/02 Javascript
jQuery实现遮罩层登录对话框
2016/12/29 Javascript
Angular 2父子组件数据传递之局部变量获取子组件其他成员
2017/07/04 Javascript
ReactNative踩坑之配置调试端口的解决方法
2017/07/28 Javascript
JavaScript实现简单评论功能
2017/08/17 Javascript
微信小程序picker组件下拉框选择input输入框的实例
2017/09/20 Javascript
详解RequireJs官方使用教程
2017/10/31 Javascript
vue仿淘宝订单状态的tab切换效果
2020/06/23 Javascript
angularJs中跳转到指定的锚点实例($anchorScroll)
2018/08/31 Javascript
Vue中通过Vue.extend动态创建实例的方法
2019/08/13 Javascript
[01:45]2014DOTA2 TI预选赛预选赛 大神专访第二弹!
2014/05/20 DOTA
[01:01:13]2018DOTA2亚洲邀请赛 4.5 淘汰赛 Mineski vs VG 第三场
2018/04/06 DOTA
matplotlib subplots 调整子图间矩的实例
2018/05/25 Python
Python中 map()函数的用法详解
2018/07/10 Python
Python 随机生成测试数据的模块:faker基本使用方法详解
2020/04/09 Python
Python的Django框架实现数据库查询(不返回QuerySet的方法)
2020/05/19 Python
Python使用re模块验证危险字符
2020/05/21 Python
python中str内置函数用法总结
2020/12/27 Python
利于python脚本编写可视化nmap和masscan的方法
2020/12/29 Python
使用css实现android系统的loading加载动画
2019/07/25 HTML / CSS
珍惜水资源建议书
2014/03/12 职场文书
2015年爱牙日活动总结
2015/02/05 职场文书
2015年宣传部个人工作总结
2015/05/14 职场文书
法定代表人免职证明
2015/06/24 职场文书
国庆放假通知怎么写
2015/07/30 职场文书