2020前端面试复习-js部分-原型和原型链
原型和原型链
大部分函数(重点是构造函数)都内置一个prototype(显式原型)的属性,属性值是一个对象,对象中存储属性和方法,是供当前类所属实例调用的公共的属性和方法。
- 箭头函数没有prototype这个属性的
- 原型对象上有一个内置的属性 constructor,属性值是当前函数本身
每一个对象都内置一个__proto__(原型链、隐式原型)的属性,属性值指向自己所属类的原型prototype对象
- Object.prototype这个对象的__proto__值是null,因为Object是所有对象的基类
数组是Array的实例,所以每一个数组的__proto__一定指向Array的原型
每个对象都是Object的实例,所以Array.prototype对象中的__proto__属性指向Object.prototype
原型链查找机制
- 首先查找当前实例对象的私有属性,私有中有,获取私有的
- 如果私有中没有,则浏览器默认基于__proto__找其所属类原型(prototype)上的公共属性和方法
- 如果还找不到,则基于原型对象上的的__proto__继续向上查找,知道找到Object.prototype为止
- arr.push()=arr.proto.push()=Array.prototype.push()
- 找到的方法都是相同的
- 区别是方法执行时的this不同
- arr.push() arr首先基于原型链查找机制,找到Array.prototype上的push并执行,方法中this是arr
- arr.proto.push() 直接跳过私有属性查找,方法执行时this是arr.proto
- Array.prototype.push() 方法执行时this是Array.prototype
- __proto__在ie浏览器中禁止访问
公有还是私有属性 是有参照物的
- arr.hasownproperty('push')->false
- Array.prototype.hasOwnProperty('push')->true
- 存储在自己的堆内存中的属性是私有的
- 基于__proto__查找到的方法是公有的
每一个数组既是数组也是对象,因为它们可以调用Array.prototype和Object.prototype
new Foo和new Foo()的区别
- 能否传递参数
- new Foo不能传
- new Foo()能传
- 运算优先级
- new Foo 19
- new Foo() 20
- obj.xxx 20
- 数字越大优先级越高
##箭头函数不具备prototype,所以不允许被new