学习目标:
快速学完vue的学前准备知识,方便之后对vue2和vue3的学习
学习内容:
- 学习es6语法规范及其新特性
- 包管理器
- 原型和原型链
- 数组的常用方法
学习产出:
上篇博客记录了es6的新特性,那么下面来接着学习包管理器和原型、原型链
一、包管理器
包管理器个人理解包管理器就是一种工具。每种语言都有其基本的内容和语法,但是有些功能会被做成一条语句来执行,比如在js中last可以返回一个字符串的最后一个元素。单个功能叫包,这些功能集合在一起就是一个包管理器。就好像我们有些游戏中要加装mod来提升游戏体验一样,你说没有mod能玩吗,肯定可以,但是加了肯定更方便更快捷。同样一个mod叫mod,多个结合就是整合包。(个人理解,不对请指正)
包管理器的范围很广,可以是命令行指令,也可以是应用程序或者软件库,js也有其对应的包管理器,比如npm、yarn等包管理器。
二、原型和原型链
- 每个构造函数都有一个prototype属性,我们称为显式原型,指向其原型对象
- 每个实例都有一个_proto_属性,我们称为隐式原型
- 实例的_proto_属性指向其构造函数的prototype,再通过prototype指向原型对象
只看文字描述可能有些抽象,我们画一个图来梳理一下其中的关系
那么从上图就可以看出来其中的关系了,构造函数可以直接访问其原型对象,实例则需要通过访问构造函数的prototype属性来访问其原型对象
原型的创建
原型是属于构造函数的,构造函数生成后,在其prototype属性中调用即可
原型链
以函数举例,我们通过一个函数1创建了另一个函数2,再通过函数2创造了函数3,那么函数123之间也有原型,函数3的_proto_隐式原型指向函数2的_proto_隐式原型,再指向函数3的_proto_原型。而在js中所有函数的顶层是function函数,所以函数1的_proto_隐式原型又指向了function的prototype原型。那么就形成了一条由函数123和function函数的原型组成的原型链。
而且不仅函数之间可以有原型链。比如我创建一个构造函数a,然后在构造函数中有另一个函数b。那么我通过构造函数a,创建了一个实例甲,因为甲是a创建的实例,所以甲下有一个函数b,这事原型链就是由b指向甲再指向a的原型链
简单讲,原型链就是函数和实例的多层嵌套后,其原型对象也一层一层往上指向更上层的原型,就形成了一条一条的原型链
原型的作用
那原型有什么作用呢?原型对象中可以定义一个该构造函数创造出来的所有实例都有的属性和方法。即写在原型对象中的属性和方法会在构造函数创建对象时自动赋给实例。
- 节省内存空间。通过原型来创建的属性值是共享的,而通过构造函数每次创建一个新的实例需要分配不同的空间,相较之下,使用原型能够节省同一构造函数所创建出的实例的内存空间。
- 实现继承。如果需要将一个函数1的原型指向另一个函数2,那么我们只需要将该函数1的prototype属性指向另一个函数2的实体,就可以再函数1的实例中访问到其父代函数2的原型函数和属性了。