热门标签 | 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。


推荐阅读
  • MySQL InnoDB 存储引擎索引机制详解
    本文深入探讨了MySQL InnoDB存储引擎中的索引技术,包括索引的基本概念、数据结构与算法、B+树的特性及其在数据库中的应用,以及索引优化策略。 ... [详细]
  • td{border:1pxsolid#808080;}参考:和FMX相关的类(表)TFmxObjectIFreeNotification ... [详细]
  • 本文探讨了异步编程的发展历程,从最初的AJAX异步回调到现代的Promise、Generator+Co以及Async/Await等技术。文章详细分析了Promise的工作原理及其源码实现,帮助开发者更好地理解和使用这一重要工具。 ... [详细]
  • ASP.NET 进度条实现详解
    本文介绍了如何在ASP.NET中使用HTML和JavaScript创建一个动态更新的进度条,并通过Default.aspx页面进行展示。 ... [详细]
  • 本文探讨了如何利用RxJS库在AngularJS应用中实现对用户单击和拖动操作的精确区分,特别是在调整区域大小的场景下。 ... [详细]
  • H5技术实现经典游戏《贪吃蛇》
    本文将分享一个使用HTML5技术实现的经典小游戏——《贪吃蛇》。通过H5技术,我们将探讨如何构建这款游戏的两种主要玩法:积分闯关和无尽模式。 ... [详细]
  • 对于初学者而言,搭建一个高效稳定的 Python 开发环境是入门的关键一步。本文将详细介绍如何利用 Anaconda 和 Jupyter Notebook 来构建一个既易于管理又功能强大的开发环境。 ... [详细]
  • 本文探讨了如何通过优化 DOM 操作来提升 JavaScript 的性能,包括使用 `createElement` 函数、动画元素、理解重绘事件及处理鼠标滚动事件等关键主题。 ... [详细]
  • 本文详细介绍了 `org.apache.tinkerpop.gremlin.structure.VertexProperty` 类中的 `key()` 方法,并提供了多个实际应用的代码示例。通过这些示例,读者可以更好地理解该方法在图数据库操作中的具体用途。 ... [详细]
  • 本周三大青年学术分享会即将开启
    由雷锋网旗下的AI研习社主办,旨在促进AI领域的知识共享和技术交流。通过邀请来自学术界和工业界的专家进行在线分享,活动致力于搭建一个连接理论与实践的平台。 ... [详细]
  • 1.绑定htmlcss1.1对象语法:  传给v-bind:class一个对象,以动态地切换class   ... [详细]
  • 吴石访谈:腾讯安全科恩实验室如何引领物联网安全研究
    腾讯安全科恩实验室曾两次成功破解特斯拉自动驾驶系统,并远程控制汽车,展示了其在汽车安全领域的强大实力。近日,该实验室负责人吴石接受了InfoQ的专访,详细介绍了团队未来的重点方向——物联网安全。 ... [详细]
  • 利用Node.js实现PSD文件的高效切图
    本文介绍了如何通过Node.js及其psd2json模块,快速实现PSD文件的自动化切图过程,以适应项目中频繁的界面更新需求。此方法不仅提高了工作效率,还简化了从设计稿到实际应用的转换流程。 ... [详细]
  • 变量间相关性分析
    本文探讨了如何通过统计方法评估两个变量之间的关系强度,重点介绍了皮尔森相关系数的计算及其应用。除了数学公式外,文章还提供了Python编程实例,展示如何利用实际数据集(如泰坦尼克号乘客数据)进行相关性检验。 ... [详细]
  • 本文详细介绍了在 Ubuntu 16.04 系统上安装和配置 PostgreSQL 数据库的方法,包括如何设置监听地址、启用密码加密、更改默认用户密码以及调整客户端访问控制。 ... [详细]
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社区 版权所有