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 相关文章推荐
编写针对IE的JS代码两种编写方法
Jan 30 Javascript
javascript中强制执行toString()具体实现
Apr 27 Javascript
删除条目时弹出的确认对话框
Jun 05 Javascript
bootstrap与Jquery UI 按钮样式冲突的解决办法
Sep 23 Javascript
js实现二级导航功能
Mar 03 Javascript
详解AngularJS1.6版本中ui-router路由中/#!/的解决方法
May 22 Javascript
Angular angular-file-upload文件上传的示例代码
Aug 23 Javascript
TypeScript基础入门教程之三重斜线指令详解
Oct 22 Javascript
JAVA面试题 static关键字详解
Jul 16 Javascript
js+HTML5 canvas 实现简单的加载条(进度条)功能示例
Jul 16 Javascript
vue实现设置载入动画和初始化页面动画效果
Oct 28 Javascript
基于vue与element实现创建试卷相关功能(实例代码)
Dec 07 Vue.js
如何把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+javascript实现二级级联菜单的制作
2008/05/06 PHP
如何利用PHP执行.SQL文件
2013/07/05 PHP
php实现XSS安全过滤的方法
2015/07/29 PHP
PHP错误处理函数
2016/04/03 PHP
Zend Framework常用校验器详解
2016/12/09 PHP
Yii框架弹出框功能示例
2017/01/07 PHP
FLASH 广告之外的链接
2008/12/16 Javascript
jquery动态添加元素事件失效问题解决方法
2014/05/23 Javascript
JavaScript中的console.trace()函数介绍
2014/12/29 Javascript
jQuery插件Tooltipster实现漂亮的工具提示
2015/04/12 Javascript
JavaScript数据推送Comet技术详解
2016/04/07 Javascript
JavaScript中的原型继承基础学习教程
2016/05/06 Javascript
jQuery插件zTree实现更新根节点中第i个节点名称的方法示例
2017/03/08 Javascript
angularjs2中父子组件的数据传递的实例代码
2017/07/05 Javascript
Vue axios 中提交表单数据(含上传文件)
2017/07/06 Javascript
JavaScript中使用Async实现异步控制
2017/08/15 Javascript
解决VUEX兼容IE上的报错问题
2018/03/01 Javascript
解决Vue项目中tff报错的问题
2020/10/21 Javascript
[58:42]DOTA2上海特级锦标赛C组败者赛 Newbee VS Archon第一局
2016/02/27 DOTA
简单介绍Python的Tornado框架中的协程异步实现原理
2015/04/23 Python
Python模拟鼠标点击实现方法(将通过实例自动化模拟在360浏览器中自动搜索python)
2017/08/23 Python
Python使用Selenium+BeautifulSoup爬取淘宝搜索页
2018/02/24 Python
解决python多行注释引发缩进错误的问题
2019/08/23 Python
Pytorch之保存读取模型实例
2019/12/30 Python
Python sorted排序方法如何实现
2020/03/31 Python
Django+Celery实现动态配置定时任务的方法示例
2020/05/26 Python
Python解析m3u8拼接下载mp4视频文件的示例代码
2021/03/03 Python
HTML5给汉字加拼音收起展开组件的实现代码
2020/04/08 HTML / CSS
世界上最大的皮肤科医生拥有和经营的美容网站:LovelySkin
2021/01/03 全球购物
解释下列WebService名词:WSDL、SOAP、UDDI
2012/06/22 面试题
表彰先进集体通报
2014/01/12 职场文书
人力管理专业毕业生求职信
2014/02/27 职场文书
教师岗位聘任书范文
2014/03/29 职场文书
中学生检讨书1000字
2014/10/28 职场文书
催款函范文
2015/06/24 职场文书
教你用python实现12306余票查询
2021/06/30 Python