JS的数据类型(6+2) number string boolean undefined null object bigint symbol
1.原型链:prototype
是什么:
a.prototype = b
b.prototype = c
那么 abc就构成了原型链
解决了什么问题:
在没有class的情况下实现了继承,以a ===>Array.prototype===>Object.prototype为例
1.a是Array.prototype的实例
2.Array继承了Object的属性
3.a是Objcet的间接实例,所以a拥有Object.prototype里的属性
优点:简单优雅
缺点:和class相比不支持私有属性(所以一般约定__x__这种格式为私有属性)
ES6引入了class,可以解决这个缺点
2.this指什么
是什么:
this是call(函数调用)的第一个参数,实际上平时都被省略了(语法糖)
f(p) => f.call(undefined,p)
o.c.f(p) => f.call(o.c,p)
浏览器会把undefined修改为window,并给全局变量前加一个window
例:array[0]() => array.0() => 0.call(array)
array就是this
如果有new则无法确定this.因为new优先级更高
3.new做了什么
new其实是js之父设计的一个语法糖,目的是方便我们创建对象时,能够用更少的代码给这个对象独有的属性并绑定原型的中属性
- 创建临时对象
- 绑定原型
- 指定this等于临时对象
- 执行构造函数
- 返回临时对象
比如说有一个机器人工厂生产机器人:
我们会写
new 机器人(i)
然后我们要给机器人私有属性
function 机器人(i){
this.ID=i,
this.剩余年限 = i,
}
机器人.prototype ={
身高 = 1.8
~~~
}
其中this指向临时对象,由new创建,并且还自动绑定了prototype
这些功能都是由new这个语法糖帮我们省略了代码