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 相关文章推荐
JS 创建对象(常见的几种方法)
Nov 03 Javascript
jquery validate poshytip 自定义样式
Nov 26 Javascript
jquery修改属性值实例代码(设置属性值)
Jan 06 Javascript
JS的get和set使用示例
Feb 20 Javascript
学习使用AngularJS文件上传控件
Feb 16 Javascript
使用Javascript判断浏览器终端设备(PC、IOS(iphone)、Android)
Jan 04 Javascript
AngularJS使用ng-inlude指令加载页面失败的原因与解决方法
Jan 19 Javascript
使用Bootstrap美化按钮实例代码(demo)
Feb 03 Javascript
js和jquery中获取非行间样式
May 05 jQuery
详解Angular之constructor和ngOnInit差异及适用场景
Jun 22 Javascript
使用json-server简单完成CRUD模拟后台数据的方法
Jul 12 Javascript
Vue如何基于es6导入外部js文件
May 15 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 excel reader读取excel内容存入数据库实现代码
2012/12/06 PHP
PHP空值检测函数与方法汇总
2017/11/19 PHP
关于Javascript 的 prototype问题。
2007/01/03 Javascript
jQuery 自动增长的文本输入框实现代码
2010/04/02 Javascript
使用jQuery中的when实现多个AJAX请求对应单个回调的例子分享
2014/04/23 Javascript
RequireJS使用注意细节
2016/05/15 Javascript
javascript 数组的正态分布排序的问题
2016/07/31 Javascript
详解JS-- 浮点数运算处理
2016/11/28 Javascript
利用select实现年月日三级联动的日期选择效果【推荐】
2016/12/13 Javascript
利用JS对iframe父子(内外)页面进行操作的方法教程
2017/06/15 Javascript
node的process以及child_process模块学习笔记
2018/03/06 Javascript
Vue循环组件加validate多表单验证的实例
2018/09/18 Javascript
30分钟精通React今年最劲爆的新特性——React Hooks
2019/03/11 Javascript
python使用xauth方式登录饭否网然后发消息
2014/04/11 Python
Python文件夹与文件的相关操作(推荐)
2016/07/25 Python
Python实现矩阵加法和乘法的方法分析
2017/12/19 Python
Python3中正则模块re.compile、re.match及re.search函数用法详解
2018/06/11 Python
Django 中使用流响应处理视频的方法
2018/07/20 Python
Python 3.3实现计算两个日期间隔秒数/天数的方法示例
2019/01/07 Python
django中使用POST方法获取POST数据
2019/08/20 Python
python生成器用法实例详解
2019/11/22 Python
基于TensorBoard中graph模块图结构分析
2020/02/15 Python
python中使用you-get库批量在线下载bilibili视频的教程
2020/03/10 Python
Jupyter Notebook安装及使用方法解析
2020/11/12 Python
Python实现简单猜数字游戏
2021/02/03 Python
CSS3实现图片抽屉式效果的示例代码
2019/11/06 HTML / CSS
雪花秀美国官方网站:韩国著名草本护肤化妆品品牌
2016/10/19 全球购物
巴西儿童时尚购物网站:Dinda
2019/08/14 全球购物
印尼在线旅游门户网站:NusaTrip
2019/11/01 全球购物
澳大利亚在线奢侈品时尚零售平台:Azura Runway
2021/01/13 全球购物
输入一行文字,找出其中大写字母、小写字母、空格、数字、及其他字符各有多少
2016/04/15 面试题
介绍一下.net和Java的特点和区别
2012/09/26 面试题
汉语言文学职业规划
2014/02/14 职场文书
交通事故赔偿协议书怎么写
2014/10/04 职场文书
2015年学生会主席工作总结
2015/04/21 职场文书
2019学生会干事辞职信
2019/06/27 职场文书