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控制上传文件的大小
Oct 26 Javascript
javascript中字符串拼接需注意的问题
Jul 13 Javascript
JSON为什么那样红为什么要用json(另有洞天)
Dec 26 Javascript
jquery取子节点及当前节点属性值的方法
Sep 09 Javascript
Bootstrap入门书籍之(零)Bootstrap简介
Feb 17 Javascript
手机图片预览插件photoswipe.js使用总结
Aug 25 Javascript
KnockoutJS 3.X API 第四章之数据控制流component绑定
Oct 10 Javascript
详解Vue.js动态绑定class
Dec 20 Javascript
ajax请求+vue.js渲染+页面加载的示例
Feb 11 Javascript
JS+php后台实现文件上传功能详解
Mar 02 Javascript
解决微信小程序调用moveToLocation失效问题【超简单】
Apr 12 Javascript
Vue性能优化的方法
Jul 30 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(3)
2006/10/09 PHP
我常用的几个类
2006/10/09 PHP
php判断str字符串是否是xml格式数据的方法示例
2017/07/26 PHP
TP(thinkPHP)框架多层控制器和多级控制器的使用示例
2018/06/13 PHP
php面试实现反射注入的详细方法
2019/09/30 PHP
javascript中的location用法简单介绍
2007/03/07 Javascript
node.js中的querystring.unescape方法使用说明
2014/12/10 Javascript
javascript实现表单提交后,提交按钮不可用的方法
2015/04/18 Javascript
深入理解AngularJS中的ng-bind-html指令和$sce服务
2016/09/08 Javascript
详解nodejs 文本操作模块-fs模块(二)
2016/12/22 NodeJs
Bootstrap风格的zTree右键菜单
2017/02/17 Javascript
详解Node.js利用node-git-server快速搭建git服务器
2017/09/27 Javascript
js原生实现移动端手指滑动轮播图效果的示例
2018/01/02 Javascript
js replace 全局替换的操作方法
2018/06/12 Javascript
JS中‘hello’与new String(‘hello’)引出的问题详解
2018/08/14 Javascript
layui自己添加图片按钮并点击跳转页面的例子
2019/09/14 Javascript
Vue.js实现大屏数字滚动翻转效果
2019/11/29 Javascript
es6中let和const的使用方法详解
2020/02/24 Javascript
Python深入学习之闭包
2014/08/31 Python
浅谈Python中copy()方法的使用
2015/05/21 Python
Python实现确认字符串是否包含指定字符串的实例
2018/05/02 Python
Python实现的生产者、消费者问题完整实例
2018/05/30 Python
Pandas 合并多个Dataframe(merge,concat)的方法
2018/06/08 Python
使用python获取(宜宾市地震信息)地震信息
2019/06/20 Python
Pycharm 2019 破解激活方法图文详解
2019/10/11 Python
Win系统PyQt5安装和使用教程
2019/12/25 Python
Python延迟绑定问题原理及解决方案
2020/08/04 Python
用python对excel查重
2020/12/07 Python
HTML+CSS3模拟心的跳动实例代码
2017/09/05 HTML / CSS
印度领先的在线时尚商店:Koovs
2016/08/28 全球购物
机械设计专业应届生求职信
2013/11/21 职场文书
《长江之歌》教学反思
2014/04/17 职场文书
淮阳太昊陵导游词
2015/02/10 职场文书
干部培训工作总结2015
2015/05/25 职场文书
js中Map和Set的用法及区别实例详解
2022/02/15 Javascript
python语言中pandas字符串分割str.split()函数
2022/08/05 Python