热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

javascript的继续你相识若干?

什么是继续?大多数人运用继续不外乎是为了取得这两点优点,代码的笼统和代码的复用。代码的笼统就不用说了,交通东西和汽车这类的例子不可胜数,在传统的OO语言中(比如Java),代码的笼

什么是继续?

大多数人运用继续不外乎是为了取得这两点优点,代码的笼统和代码的复用。

代码的笼统就不用说了,交通东西和汽车这类的例子不可胜数,在传统的OO语言中(比如Java),代码的笼统更多的是运用接口(interface)来完成,而运用继续更多地是为了代码的复用(虽然如今强调运用组合而不是运用继续)。

怎样复用的?打个比如,class A 继续了 class B,class A便具有了class B 的public 和 protected范例的变量和要领,用最简朴的要领去想,就是 class B 将 这些属性和要领直接copy给class A,如许便完成了继续。

因而我们能够如许说,继续实际上是一品种与类之间的copy行动。

Javascript中的继续

在Javascript中没有类的观点,只要对象。虽然如今人们常常运用class关键字,这让Javascript看起来似乎是具有了”类”,可外表看到的不一定是实质,class只是一块糖,嚼碎了才晓得内里实在照样原型链那一套。因而,Javascript中的继续只是对象与对象之间的继续。反观继续的实质,继续就是让子类具有父类的一些属性和要领,那末在Javascript中就是让一个对象具有另一个对象的属性和要领。

所以,这给我了我们一条非常清楚的思绪,Javascript中怎样完成继续?只需让一个对象具有另一个对象的属性和要领,这就完成了。

应用Mixin

既然让一个对象具有另一个对象的属性和要领,起首想到的就是应用Mixin的粗犷体式格局,直接将对象的属性和要领强迫copy到另一个对象。

就像如许

function mixin(subObj, parentObj) {
for (var prop in parentObj) {
if (!(prop in subObj)) {
subObj[prop] = parentObj[prop]
}
}
}

固然也能够用ES6中的更文雅的Object.assign。

这段代码就完成了最简朴的从一个对象复制属性和要领到另一个对象。然则这类要领有一个缺点,假如父对象的属性是援用范例,比如一个对象或许数组,那末修正子对象的时刻必将会对父对象也形成修正,这明显不可接收。一种主意是采纳深度克隆,然则又可能会有轮回援用的题目。

所以,这类继续体式格局,比较合适对简朴对象的拓展,不太合适更庞杂的继续。

应用原型链

起首来讲一下什么是原型,原型在Javascript中,实在就是某个对象的一个属性。只不过这个属性很特别,关于外界平常是不可见(在chrome中能够经由过程__proto__猎取),我们平常把它叫作[[Prototype]]。这里和函数的prototype属性很相似但倒是两个东西,后面会提到。

那末什么是原型链呢,望文生义就像如许:

obj1.[[Prototype]] ===> obj2.[[Prototype]] ===> obj3.[[Prototype]]…. ===> Object.prototype

某一对象的原型属性中保存着另一个对象,以此类推,彷佛链子一样串起来。

链的尽头是Object.prototype对象,因而Object.prototype没有原型。当我们构建一个对象,这个对象的默许的原型就是Object.prototype

在chrome中考证一下:

var a = {}
Object.prototype === a.__proto__ // true

那末我们怎样用原型链完成继续呢?这要归功于Javascript中的托付机制。

当我们猎取一个对象的某个属性时,比如a.b,会默许挪用一个内置的[[Get]]要领,这个[[Get]]要领的算法就是:

在当前对象里查找,找不到则托付给当前对象的[[Prototype]],再找不到则托付给[[Prototype]]的[[Prototype]],直到Object.prototype中也没找到,则返回undefined。

因而,我们想让对象a具有对象b的属性和要领,即对象a继续对象b,只需要把b赋值给a的[[Prototype]],应用属性查找的托付机制,完成了a也”具有”了b的属性和要领,而且当a中有和b中的同名属性时,因为”屏障作用”,只要a中的属性会被优先猎取到,完成了override,看起来相称圆满。

new 和 “组织函数”

前面提到,[[Prototype]]是个内置隐蔽属性,虽然在chrome能够经由过程__proto__接见,然则其设想本意是不可被读取和修正的,那末我们怎样应用原型链来竖立继续关联?

Javascript供应了new关键字。

一般,在相似Java如许的OO语言中,new被用来实例化一个类,然则在Javascript中,new仅仅是一个函数挪用的体式格局!

Javascript中的函数也很新鲜,每个函数都有一个默许的prototype属性,这个差别于对象的[[Prototype]]属性,函数的prototype是有意暴露出来的,而且这个属性还不为空,另有prototype另有另一个属性叫constructor,这个constructor居然又援用回来了这个函数自身!因而我们看到的结果是如许的:

《Javascript的继续你相识若干?》

用new来挪用函数有什么差别的呢?new实在做了三件事:

  • 建立一个新对象
  • 将这个新对象的[[Prototype]]衔接到挪用函数的prototype上
  • 绑定挪用函数的this并挪用

用代码来示意就是:

function New(fn) {
var tmp = {}
tmp.__proto__ = fn.prototype
fn.call(tmp)
return tmp
}

能够看到,new帮我们把对象的[[Prototype]]衔接到了函数的prototype上。

到这儿,思绪就清楚了,怎样让对象a和对象b的[[Prototype]]相连完成a继续b?

只需把a的”组织函数”的[[Prototype]]衔接到b就好了。

来完成一下:

function A() {}
var b = {
show: function() {
console.log('这是来自b的要领')
}
}
A.prototype = b
// 这里修复了本来的 constructor
A.prototype.cOnstructor= A
var a = new A()
a.show() // 这是来自b的要领

更简朴的Object.create

ES5中供应的Object.create更简朴粗犷,能够直接建立一个对象并将这个对象的[[Prototype]]指向传入的对象

var b = {c: 1}
var a = Object.create(b)
console.log(a.c) // 1

模仿类继续

在Javascript中没有类的观点,虽然从ES6最先具有了class关键字,但其背地仍然是原型链作支持,所以这里照样用最实质的原型来模仿”类”的继续。这才是Javascript的本来面目!

/**
* 完成 A 继续 B
*/
function B(b) {
this.b = b
}
function A(a, b) {
// 挪用B并绑定this
B.call(this, b)
this.a = a
}
A.prototype = Object.assign({}, B.prototype)
A.prototype.cOnstructor= A
var c = new A(1, 2)
console.log(c.a) // 1
// c 具有了只要B的实例才具有的 b 属性
console.log(c.b) // 2

总结

简朴来讲,继续等于copy和复用,Javascript的继续实在就是应用原型链的查找和托付来完成属性和要领的复用,new关键字和”组织函数”只是衔接原型链的东西,如许的东西另有Object.create。


推荐阅读
  • 本文讨论了编写可保护的代码的重要性,包括提高代码的可读性、可调试性和直观性。同时介绍了优化代码的方法,如代码格式化、解释函数和提炼函数等。还提到了一些常见的坏代码味道,如不规范的命名、重复代码、过长的函数和参数列表等。最后,介绍了如何处理数据泥团和进行函数重构,以提高代码质量和可维护性。 ... [详细]
  • 不同优化算法的比较分析及实验验证
    本文介绍了神经网络优化中常用的优化方法,包括学习率调整和梯度估计修正,并通过实验验证了不同优化算法的效果。实验结果表明,Adam算法在综合考虑学习率调整和梯度估计修正方面表现较好。该研究对于优化神经网络的训练过程具有指导意义。 ... [详细]
  • 本文介绍了闭包的定义和运转机制,重点解释了闭包如何能够接触外部函数的作用域中的变量。通过词法作用域的查找规则,闭包可以访问外部函数的作用域。同时还提到了闭包的作用和影响。 ... [详细]
  • 生成式对抗网络模型综述摘要生成式对抗网络模型(GAN)是基于深度学习的一种强大的生成模型,可以应用于计算机视觉、自然语言处理、半监督学习等重要领域。生成式对抗网络 ... [详细]
  • 在Android开发中,使用Picasso库可以实现对网络图片的等比例缩放。本文介绍了使用Picasso库进行图片缩放的方法,并提供了具体的代码实现。通过获取图片的宽高,计算目标宽度和高度,并创建新图实现等比例缩放。 ... [详细]
  • 本文介绍了C#中生成随机数的三种方法,并分析了其中存在的问题。首先介绍了使用Random类生成随机数的默认方法,但在高并发情况下可能会出现重复的情况。接着通过循环生成了一系列随机数,进一步突显了这个问题。文章指出,随机数生成在任何编程语言中都是必备的功能,但Random类生成的随机数并不可靠。最后,提出了需要寻找其他可靠的随机数生成方法的建议。 ... [详细]
  • 如何使用Java获取服务器硬件信息和磁盘负载率
    本文介绍了使用Java编程语言获取服务器硬件信息和磁盘负载率的方法。首先在远程服务器上搭建一个支持服务端语言的HTTP服务,并获取服务器的磁盘信息,并将结果输出。然后在本地使用JS编写一个AJAX脚本,远程请求服务端的程序,得到结果并展示给用户。其中还介绍了如何提取硬盘序列号的方法。 ... [详细]
  • 本文介绍了南邮ctf-web的writeup,包括签到题和md5 collision。在CTF比赛和渗透测试中,可以通过查看源代码、代码注释、页面隐藏元素、超链接和HTTP响应头部来寻找flag或提示信息。利用PHP弱类型,可以发现md5('QNKCDZO')='0e830400451993494058024219903391'和md5('240610708')='0e462097431906509019562988736854'。 ... [详细]
  • Java学习笔记之面向对象编程(OOP)
    本文介绍了Java学习笔记中的面向对象编程(OOP)内容,包括OOP的三大特性(封装、继承、多态)和五大原则(单一职责原则、开放封闭原则、里式替换原则、依赖倒置原则)。通过学习OOP,可以提高代码复用性、拓展性和安全性。 ... [详细]
  • 本文介绍了iOS数据库Sqlite的SQL语句分类和常见约束关键字。SQL语句分为DDL、DML和DQL三种类型,其中DDL语句用于定义、删除和修改数据表,关键字包括create、drop和alter。常见约束关键字包括if not exists、if exists、primary key、autoincrement、not null和default。此外,还介绍了常见的数据库数据类型,包括integer、text和real。 ... [详细]
  • Oracle seg,V$TEMPSEG_USAGE与Oracle排序的关系及使用方法
    本文介绍了Oracle seg,V$TEMPSEG_USAGE与Oracle排序之间的关系,V$TEMPSEG_USAGE是V_$SORT_USAGE的同义词,通过查询dba_objects和dba_synonyms视图可以了解到它们的详细信息。同时,还探讨了V$TEMPSEG_USAGE的使用方法。 ... [详细]
  • 本文讨论了在openwrt-17.01版本中,mt7628设备上初始化启动时eth0的mac地址总是随机生成的问题。每次随机生成的eth0的mac地址都会写到/sys/class/net/eth0/address目录下,而openwrt-17.01原版的SDK会根据随机生成的eth0的mac地址再生成eth0.1、eth0.2等,生成后的mac地址会保存在/etc/config/network下。 ... [详细]
  • 浏览器中的异常检测算法及其在深度学习中的应用
    本文介绍了在浏览器中进行异常检测的算法,包括统计学方法和机器学习方法,并探讨了异常检测在深度学习中的应用。异常检测在金融领域的信用卡欺诈、企业安全领域的非法入侵、IT运维中的设备维护时间点预测等方面具有广泛的应用。通过使用TensorFlow.js进行异常检测,可以实现对单变量和多变量异常的检测。统计学方法通过估计数据的分布概率来计算数据点的异常概率,而机器学习方法则通过训练数据来建立异常检测模型。 ... [详细]
  • 本文由编程笔记#小编为大家整理,主要介绍了logistic回归(线性和非线性)相关的知识,包括线性logistic回归的代码和数据集的分布情况。希望对你有一定的参考价值。 ... [详细]
  • 从零学Java(10)之方法详解,喷打野你真的没我6!
    本文介绍了从零学Java系列中的第10篇文章,详解了Java中的方法。同时讨论了打野过程中喷打野的影响,以及金色打野刀对经济的增加和线上队友经济的影响。指出喷打野会导致线上经济的消减和影响队伍的团结。 ... [详细]
author-avatar
xzcxzfvxvc
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有