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实现trim()的解决办法
Apr 16 Javascript
使用jQuery中的when实现多个AJAX请求对应单个回调的例子分享
Apr 23 Javascript
js检验密码强度(低中高)附图
Jun 05 Javascript
jquery不常用方法汇总
Jul 26 Javascript
如何用js 实现依赖注入的思想,后端框架思想搬到前端来
Aug 03 Javascript
JS遍历数组及打印数组实例分析
Jan 21 Javascript
Vue 2.0学习笔记之Vue中的computed属性
Oct 16 Javascript
vue 引入公共css文件的简单方法(推荐)
Jan 20 Javascript
JavaScript封闭函数及常用内置对象示例
May 13 Javascript
layui lay-verify form表单自定义验证规则详解
Sep 18 Javascript
JavaScript实现捕获鼠标坐标
Apr 12 Javascript
关于element-ui表单中限制输入纯数字的解决方式
Sep 08 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
php4的session功能评述(二)
2006/10/09 PHP
用PHP连接MySQL代码的参数说明
2008/06/07 PHP
php 获取mysql数据库信息代码
2009/03/12 PHP
CI框架实现cookie登陆的方法详解
2016/05/18 PHP
详谈PHP中public,private,protected,abstract等关键字的用法
2017/12/31 PHP
windows 2008r2+php5.6.28环境搭建详细过程
2019/06/18 PHP
Laravel 模型关联基础教程详解
2019/09/17 PHP
基于Laravel(5.4版本)的基本增删改查操作方法
2019/10/11 PHP
用javascript编写的第一人称射击游戏
2007/02/25 Javascript
表单(FORM)的一些实用效果代码
2007/03/25 Javascript
jQuery.holdReady()方法用法实例
2014/12/27 Javascript
简述JavaScript中正则表达式的使用方法
2015/06/15 Javascript
uploadify多文件上传参数设置技巧
2015/11/16 Javascript
详解JavaScript异步编程中jQuery的promise对象的作用
2016/05/03 Javascript
JavaScript与ActionScript3两者的同性与差异性
2016/09/22 Javascript
浅谈javascript中的三种弹窗
2016/10/21 Javascript
详解如何提高 webpack 构建 Vue 项目的速度
2017/07/03 Javascript
JavaScript实现无刷新上传预览图片功能
2017/08/02 Javascript
基于nodejs res.end和res.send的区别
2018/05/14 NodeJs
win7安装python生成随机数代码分享
2013/12/27 Python
python通过zlib实现压缩与解压字符串的方法
2014/11/19 Python
python批量创建指定名称的文件夹
2019/03/21 Python
使用python进行广告点击率的预测的实现
2019/07/04 Python
对python中基于tcp协议的通信(数据传输)实例讲解
2019/07/22 Python
Python 剪绳子的多种思路实现(动态规划和贪心)
2020/02/24 Python
详解FireFox下Canvas使用图像合成绘制SVG的Bug
2019/07/10 HTML / CSS
李宁官方网店:中国运动品牌
2017/11/02 全球购物
文秘专业自荐信
2013/10/14 职场文书
商务英语应届生自我鉴定
2013/12/08 职场文书
幼儿园中班开学寄语
2014/04/03 职场文书
《大自然的语言》教学反思
2014/04/08 职场文书
励志演讲稿范文
2014/04/29 职场文书
反腐倡廉主题教育活动总结
2015/05/07 职场文书
python 对图片进行简单的处理
2021/06/23 Python
Golang表示枚举类型的详细讲解
2021/09/04 Golang
nginx 配置缓存
2022/05/11 Servers