JavaScript设计模式之原型模式分析【ES5与ES6】
作者:筱葭 发布时间:2024-05-02 16:29:37
本文实例讲述了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有两种类型机制:基本类型和对象类型。基本类型包括undefined
、number
、boolean
、string
、function
、object
。
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程序设计有所帮助。
来源:https://blog.csdn.net/zhouziyu2011/article/details/68942872
猜你喜欢
- 1、简介Burp Suite是用于攻击web应用程序的集成平台。它包含了许多工具,并为这些工具设计了许多接口,以促进加快攻击应用程序的过程。
- 1、单继承:子类只继承一个父类举例:煎饼果子老师傅在煎饼果子界摸爬滚打几十年,拥有一身精湛的煎饼果子技术,并总结了一套"古法煎饼果
- 沟通的时候,一般我不主动说自己是做用户体验设计,也不说做以用户为中心的设计,包括UED, UCD。这种专业名词传达的太虚,你也许是名用户体验
- 涉及到的函数为import matplotlib.pyplot as pltfrom skimage import measure, col
- 本文实例为大家分享了JS实现拖动模糊框特效的具体代码,供大家参考,具体内容如下需求:在图片上拖动按钮,图片蒙层慢慢覆盖,当蒙层边缘碰到左右下
- 索引 经常要查询的语句,则给它建一个索引 表连接 select T_Oders as o join T_Customers as C on
- 最近我因为要安装 Firebug 1.4 导致我不得不安装了 Firefox 3.5 ,所以很不小心地接触到了Wordpress后台那漂亮的
- A.动态页面第一步:创建转向控制页面,创建网站默认的首页文件(通常为"index.asp"或"default.
- 1、TransBigData简介TransBigData是一个为交通时空大数据处理、分析和可视化而开发的Python包。TransBigDa
- 这几天无聊的很看着china.nba.com焦点图效果捣鼓了一下有待完善!兼容性:IE6 , IE7 &nb
- el-table使用el-select选中后无效需求:表格中一行显示一条数据,数据中的某个属性要展示一列,并且再另一列中用el-select
- 基于Python2.7的版本环境,Python实现的数据库跨服务器(跨库)迁移, 每以5000条一查询一提交,代码中可以自行更改
- 前言前面一篇分享了关于数值的一些处理方式,本篇呢进行一下字符串处理的分享 题目也是超级简单,记录一下对字符串处理的方式错位键盘🍓(也就是错位
- 在Navicat中,时间戳(timestamp)格式的数据表现为:查询某一天的数据SELECT * FROM my_tableWHERE `
- UDP 套接字是可以使用 connect 系统调用连接到指定的地址的。从此以后,这个套接字只会接收来自这个地址的数据,而且可以使用 send
- 在学习python的时候,被推荐了使用PyCharm这款IDE,但是在import包的时候却发生了问题- -无法引入,但是明明通过了pip进
- golang判断元素是否在数组内众所周知,golang里没有像python的in来判断元素是否在list里存在,可替代的办法是将list放到
- #-*- coding:utf-8 -*- from win32com.client import Dispatch import time
- debian6系统:首先先安装mysql吧:打开终端(root)用户登入apt-get purge mysql-server-5.5安装完成
- 前言:相比大家都听过自动化生产线、自动化办公等词汇,在没有人工干预的情况下,机器可以自己完成各项任务,这大大提升了工作效率。编程世界里有各种