面试题:JS的设计:prototype&this&new

186 阅读1分钟

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这个语法糖帮我们省略了代码