2020前端面试复习-js部分-原型和原型链

89 阅读2分钟

原型和原型链

大部分函数(重点是构造函数)都内置一个prototype(显式原型)的属性,属性值是一个对象,对象中存储属性和方法,是供当前类所属实例调用的公共的属性和方法。

  1. 箭头函数没有prototype这个属性的
  2. 原型对象上有一个内置的属性 constructor,属性值是当前函数本身

每一个对象都内置一个__proto__(原型链、隐式原型)的属性,属性值指向自己所属类的原型prototype对象

  1. Object.prototype这个对象的__proto__值是null,因为Object是所有对象的基类

数组是Array的实例,所以每一个数组的__proto__一定指向Array的原型

每个对象都是Object的实例,所以Array.prototype对象中的__proto__属性指向Object.prototype

原型链查找机制

  1. 首先查找当前实例对象的私有属性,私有中有,获取私有的
  2. 如果私有中没有,则浏览器默认基于__proto__找其所属类原型(prototype)上的公共属性和方法
  3. 如果还找不到,则基于原型对象上的的__proto__继续向上查找,知道找到Object.prototype为止
  4. arr.push()=arr.proto.push()=Array.prototype.push()
    1. 找到的方法都是相同的
    2. 区别是方法执行时的this不同
      1. arr.push() arr首先基于原型链查找机制,找到Array.prototype上的push并执行,方法中this是arr
      2. arr.proto.push() 直接跳过私有属性查找,方法执行时this是arr.proto
      3. Array.prototype.push() 方法执行时this是Array.prototype
    3. __proto__在ie浏览器中禁止访问

公有还是私有属性 是有参照物的

  1. arr.hasownproperty('push')->false
  2. Array.prototype.hasOwnProperty('push')->true
  3. 存储在自己的堆内存中的属性是私有的
  4. 基于__proto__查找到的方法是公有的

每一个数组既是数组也是对象,因为它们可以调用Array.prototype和Object.prototype

new Foo和new Foo()的区别

  1. 能否传递参数
    1. new Foo不能传
    2. new Foo()能传
  2. 运算优先级
    1. new Foo 19
    2. new Foo() 20
    3. obj.xxx 20
    4. 数字越大优先级越高 ##箭头函数不具备prototype,所以不允许被new