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 相关文章推荐
jquery动态加载图片数据练习代码
Aug 04 Javascript
日历查询的算法 如何计算某一天是星期几
Dec 12 Javascript
javascript自动改变文字大小和颜色的效果的小例子
Aug 02 Javascript
完美兼容各大浏览器的jQuery仿新浪图文淡入淡出间歇滚动特效
Nov 12 Javascript
JavaScript模拟鼠标右键菜单效果
Dec 08 Javascript
浅析js绑定事件的常用方法
May 15 Javascript
jQuery实现表格行和列的动态添加与删除方法【测试可用】
Aug 01 Javascript
微信+angularJS的SPA应用中用router进行页面跳转,jssdk校验失败问题解决
Sep 09 Javascript
jquery ajax后台返回list,前台用jquery遍历list的实现
Oct 30 Javascript
Angular中自定义Debounce Click指令防止重复点击
Jul 26 Javascript
详细分析JS函数去抖和节流
Dec 05 Javascript
深入了解JavaScript 的 WebAssembly
Jun 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
DISCUZ 分页代码
2007/01/02 PHP
PHP魔术引号所带来的安全问题分析
2014/07/15 PHP
什么情况下可以不写PHP的闭合标签“?>”
2014/08/28 PHP
php实现smarty模板无限极分类的方法
2015/12/07 PHP
PHP读取mssql json数据中文乱码的解决办法
2016/04/11 PHP
php基于单例模式封装mysql类完整实例
2016/10/18 PHP
thinkPHP5.1框架使用SemanticUI实现分页功能示例
2019/08/03 PHP
用javascript实现读取txt文档的脚本
2007/07/20 Javascript
通过百度地图获取公交线路的站点坐标的js代码
2012/05/11 Javascript
jquery实现微博文字输入框 输入时显示输入字数 效果实现
2013/07/12 Javascript
showModelDialog弹出文件下载窗口的使用示例
2013/11/19 Javascript
javascript函数中参数传递问题示例探讨
2014/07/31 Javascript
js实现拖拽效果
2015/02/12 Javascript
AngualrJS中每次$http请求时的一个遮罩层Directive
2016/01/26 Javascript
JS实现JSON.stringify的实例代码讲解
2017/02/07 Javascript
JS实现商品筛选功能
2020/08/19 Javascript
深入浅出webpack教程系列_安装与基本打包用法和命令参数详解
2017/09/10 Javascript
基于jQuery选择器之表单对象属性筛选选择器的实例
2017/09/19 jQuery
使用socket.io实现简单聊天室案例
2018/01/02 Javascript
最简单的vue消息提示全局组件的方法
2019/06/16 Javascript
vue前后分离调起微信支付
2019/07/29 Javascript
解决layui-table单元格设置为百分比在ie8下不能自适应的问题
2019/09/28 Javascript
[53:15]2018DOTA2亚洲邀请赛3月29日 小组赛A组 KG VS OG
2018/03/30 DOTA
Python引用(import)文件夹下的py文件的方法
2014/08/26 Python
Python易忽视知识点小结
2015/05/25 Python
使用Python的Twisted框架构建非阻塞下载程序的实例教程
2016/05/25 Python
TensorFlow安装及jupyter notebook配置方法
2017/09/08 Python
Python创建或生成列表的操作方法
2019/06/19 Python
Python telnet登陆功能实现代码
2020/04/16 Python
使用Filters滤镜弥补CSS3的跨浏览器问题以及兼容低版本IE
2013/01/23 HTML / CSS
Sneaker Studio捷克:购买运动鞋
2018/07/08 全球购物
英国第一的市场和亚马逊替代品:OnBuy
2019/03/16 全球购物
Vilebrequin美国官方网上商店:法国豪华泳装品牌
2020/02/22 全球购物
提高EJB性能都有哪些技巧
2012/03/25 面试题
幼儿园招生广告
2014/03/19 职场文书
写给女朋友的检讨书
2015/05/06 职场文书