javascript 本地对象和内置对象_详解 JavaScript 面向对象

28d3309f950e128a4df75e9d52c10f9f.png

1. 概述

JavaScript面向对象比较难理解的点是类的继承。不管是es5写法还是es6写法,JavaScript继承的本质是原型链。具体可看我的上一篇文章:

田浩:详解原型、原型链、构造函、实例、new​zhuanlan.zhihu.com
dea03a15090578781e476008350c9f8e.png

因为es6有专门的语法,写法很简单且容易理解,所以本文将着重介绍es5的实现继承不同方式及其原理。

再阅读本文之前,一定要注意区分几个名词:父类、子类、子类的实例。


2.类的声明和实例化:

/*** 类的声明*/
var Animal = function () {this.name = 'Animal';
};/*** es6中class的声明*/
class Animal2 {constructor () {this.name = 'Animal2';}
}/*** 实例化方式相同*/
let dog = new Animal();
let dog2 = new Animal2();

2. ES5中类的继承:

2.1 借助构造函数实现继承(部分继承)

function Parent1 () {this.name = 'parent1';
}Parent1.prototype.say = function () {
};      // 不会被子类继承function Child1 () {Parent1.call(this);this.type = 'child1';
}   

原理:

核心在于:Parent1.call(this)

改变Parant1运行时的this的指向,指向子构造函数,所以父类中有的属性,子类中也有。

缺点:

父类原型链上的属性方法并没有被子类继承。 所以这种方式不能成为继承,只能叫做部分继承。

2.2 借助原型链实现继承

function Parent2 () {this.name = 'parent2';this.array = [1,2,3];
}
function Child2 () {this.type = 'child2';
}
Child2.prototype = new Parent2();

原理:

核心在于: Child2.prototype =new Parent2();

将Parent2的一个实例作为Child2的prototype。访问Child2的实例时候,实例可以通过__proto__访问Parent2中的属性。

缺点:

试想,如果Child2实例两个对象s1、s2,他们通过__proto__访问的父类上的属性实际上是同一个引用(s1.__proto__ === s2.__proto__)。这样,比如s1修改array,s2的array也会跟着变。这是我们所不想看到的。

2.3 组合方式

将上两种组合:

function Parent3 () {this.name = 'parent3';this.array = [1, 2, 3];
}
function Child3 () {Parent3.call(this); this.type = 'child3';
}
Child3.prototype = new Parent3();

原理:

核心在于: 将上两种方式结合。实际上,子类的实例中,Parent3上的属性会存在两份,一份在实例中,一份在实例的__proto__上:

1c6cee89fe02859c621aa9772a18c27e.png

缺点:

实例化子类的时候,父类执行了两次,且子类实例中存在冗余数据。这些都是没有必要的。

2.4 组合继承的优化1

function Parent4 () {this.name = 'parent4';this.play = [1, 2, 3];
}
function Child4 () {Parent4.call(this);this.type = 'child4';
}
Child4.prototype = Parent4.prototype;

原理:

核心在于: 将 Parent4的prototype直接赋给Child4.prototype。此时父类只执行一次。

af17c36a539014af380e66dbe2518fe7.png

缺点:

子类实例的constructor会指向父类:a的constructor会指向Parent4,不符合预期,无法区分这个实例是父类创造的还是子类创造的。当然这个缺点在2.3中也存在。原因是constructor属性来自原型对象中,上述方法子类的实例访问constructor 实际访问的事父类的prototype中的constructor。

2.5 组合继承的优化2

function Parent5 () {this.name = 'parent5';this.play = [1, 2, 3];
}
function Child5 () {Parent5.call(this);this.type = 'child5';
}
Child5.prototype = Object.create(Parent5.prototype);
// 手动修改constructor指向,由于父类的prototype和子类的prototype已经隔离开,可以放心修改。
Child5.prototype.constructor = Child5;

原理:

核心在于: Object.create(Parent5.prototype);

Object.create()方法创建一个新对象,使用现有的对象来提供新创建的对象的__proto__。

Object.create()​developer.mozilla.org
244ab3dcc27b0a9273904db2f9950afa.png

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/532217.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

工作汇报ppt案例_【赠书】开工大吉!今年一定要干过写PPT的!

不知不觉,春节就过去了,新年开工,朋友圈里晒满了开工红包,领了开工礼就意味着真正新的一年开始了。虽然假期的慵懒安逸留下了倦怠的后遗症,但状态依旧切换到工作模式,毕竟每年都希望能比过去更进一步&#…

postscript打印机什么意思_涨知识|你不知道的关于打印机的打印过程和打印机驱动的那些事...

以前一直以为打印很简单,不就是编辑好文件按个“打印”就行了?但其实打印过程可以复杂到你分分钟“怀疑人生”。你以为的打印过程可能是这样的 ↓。我们看到的打印过程然而,真正的打印过程是这样的 ↓。实际上的打印过程打印机打印一页文件或…

python dicom图像分割_python读取DICOM头文件的实例

这篇文章主要介绍了关于python 读取DICOM头文件的实例,有着一定的参考价值,现在分享给大家,有需要的朋友可以参考一下 用dicompyler软件打开dicom图像,头文件如图所示:当然也可以直接读取: ds dicom.read_…

索尼android电视图片轮播,电视投屏居然还能这样玩?

原标题:电视投屏居然还能这样玩?现如今,投屏几乎成为大家日常生活必不可少的一种观影方式,通过电视投屏可以带来更清晰的画面效果,成为追剧党以及各类球赛爱好者的不二之选。那么今天小智就以索尼电视为例,…

android 高并发弹幕,高并发实时直播弹幕研发实践

高并发实时直播弹幕研发实践直播间特点聊天室限制人数的原因应对万级以上的实时互动跨服务器是为了解决单一服务器接入数量限制、发布消息吞吐限制等问题;多进程并发则是为了充分利用多核CPU以及减小一个循环规模从而达到降低延迟的目的。云巴实时系统的设计云巴是基…

linux python3_在Linux上安装Python 3

在Linux上安装Python 3这份文档描述了如何在Ubuntu Linux机器上安装Python 3.6。 想要获取已安装的Python 3版本号,可以通过终端运行命令: $ python3 --version 如果您使用的是Ubuntu 16.10或更新,可以通过以下命令简单地安装Python 3.6: $ s…

android手机电话铃声设置,安卓手机铃声怎么设置

网上有很多安卓手机铃声的设置教程,说什么SD卡里建立这个那个的文件夹,那问题是怎么才能进到SD卡里去建立文件夹啊?手机里哪个选项里进去呢?这里小编告诉你,可以通过电脑连接数据线管理SD卡。下面介绍两种简单的设置安…

安装squid_「首席推荐」设置Squid转发代理或者正向代理

如果您正在阅读这篇文章,您可能会因为缺少与Squid相关的信息而感到沮丧,Squid是一种非常流行的转发代理。这些令人沮丧的事情包括:在小的软件修订之后出现的重大的可用性变化,对幕后发生的事情的误解,以及真正糟糕的文档。这是一个…

android区域截图app,【干货】最新App应用市场截图尺寸大全

今天给大家分享最新的干货,刚好碰上这段时间设计市场截图,所以给各位设计新人,分享本人整合的尺寸大全,希望对你们的设计之路有所帮助。一、IOS App Store尺寸尺寸(机型) 大小(px)3.5寸(iphone4/4s)…

2018python做图形界面哪个库简单_2018年常见的python编程开发库都有哪些类型

python编程开发可以说是目前比较热门的一项编程开发语言了,而今天我们就一起来了解一下,关于python编程都有哪些常见的python库可以使用。1、TensorFlow “TensorFlow是一个使用数据流图进行数值计算的开源软件库。图形节点表示数学运算,而图…

c++ socket线程池_java 网络编程,Socket编程

Java的网络编程主要涉及到的内容是Socket编程,那么什么是Socket呢?简单地说,Socket,套接字,就是两台主机之间逻辑连接的端点。TPC/IP协议是传输层协议,主要解决数据如何在网络中传输,而HTTP是应…

android签名忘记密码,修改Android签名证书keystore的密码、别名alias以及别名密码

之前在测试Eclipse ADT的Custom debug Eclipse ADT的Custom debug keystore所需证书规格,提到过自定义调试证书的密码和1. 首先当然是先复制一份正式证书出来作为要修改为的临时调试证书。2. 修改keystore密码的命令(keytool为JDK带的命令行工具):keytoo…

识别物体是否存在_【科学实践Vol.1】带你玩转“人脸识别”

随着时代的发展,人脸识别在我们的生活中变得随处可见:商场里的人脸识别储物柜,校园里的人脸识别刷卡机,手机里的面部解锁……这些应用极大的便利了我们的日常生活。今天,就让我们一起走进人脸识别的原理世界。首先我们…

html 自动适应手机屏幕大小,HTML5 canvas自适应手机屏幕大小的一种解决方案

一、最终效果为了不浪费大家时间,先展示最终效果,看看是不是大家需要的解决方案:标准分辨率:其他分辨率的适配情况:二、需求1.canvas的内容能全部展示在屏幕上2.尽量能保证图像不变形3.绘制的文字也能自适应三、解决方…

编写一个能够排序的函数模板。_LeetCode刷题——9.给出n对括号,请编写一个函数来生成所有的由n对括号组成的合法组合...

难度(medium)题目描述:给出n对括号,请编写一个函数来生成所有的由n对括号组成的合法组合。例如n3,解集为: "((()))", "(()())", "(())()", "()(())", "()()()" 思路&#xf…

html5怎么产生手风琴效果,Html5 js如何实现手风琴效果

Html5 js如何实现手风琴效果发布时间:2020-08-03 09:54:10来源:亿速云阅读:92作者:小猪这篇文章主要为大家展示了Html5 js如何实现手风琴效果,内容简而易懂,希望大家可以学习一下,学习完之后肯定…

c++进制转换_一文了解进制之间的原理和转换

点击这段文字: 获取2020年,最强Python学习资料进制这块,可以做简单的了解。生活中我们使用的数字都是十进制的,而二进制是机器能够识别的最直接的语言。但是二进制又太大,记录起来非常的不方便。所以通常会将二进制转化…

用HTML做一个简单的web登录页面,简单的JavaWeb注册登录案例

简单的JavaWeb注册登录案例1.注册页面register.htmlregister姓名:电话:邮箱:qq:2.注册案例实现程序register.java/*** 注册案例实现程序* author lucky**/public class register extends HttpServlet {public void doGet(HttpServ…

一层循环时间复杂度_算法的时间与空间复杂度(一看就懂)

算法(Algorithm)是指用来操作数据、解决程序问题的一组方法。对于同一个问题,使用不同的算法,也许最终得到的结果是一样的,但在过程中消耗的资源和时间却会有很大的区别。那么我们应该如何去衡量不同算法之间的优劣呢&…

用ajax替换html代码,替换Ajax响应一个div的内部HTML(Replace inner HTML of a div w

我试图一些时间间隔后改变一个div的内部HTML。 我得到我想要使用Ajax正确的反应。 但无法取代内HTML的后,并用Ajax响应地选择。 什么是错我的代码..HTML51 seconds ago58 seconds ago.....10 minute agoĴ查询setInterval(function() {$( ".time" ).each(…