一,认识原型
大部分函数(重点是构造函数)都内置一个prototype的属性(又叫原型属性或者显式原型),属性值是一个对象,对象中存储的属性和方法是供当前类的所有下属实例,调用的公共的属性和方法。
注意 : 箭头函数是没有prototype属性的。
在原型对象上有一个内置的属性constructor(构造器),属性值是当前函数本身。
二,认识原型链
每一个对象都内置一个__proto__属性(又叫原型链或者隐式原型),属性值指向自己所属类的原型对象。
注意 : Object.prototype这个对象的__proto__值是null,因为Object是所有对象的“基类”
三,
1)函数数据类型包括:
普通函数
箭头函数
生成器函数
构造函数(类)等等
2)对象数据类型包括:
普通对象,日期对象,正则对象,数组对象。。。
实例也是对象数据类型的(排除7中基本数据类型值)
prototype/__proto__的属性值也是对象数据类型的(排除Function.prototype)
四,图解Object Array arr原型和原型链
五,原型链查找机制
首先查找当前实例对象的私有属性,私有中有,获取的就是私有的;如果私有中没有,则浏览器默认基于__proto__找其所属类的原型对象上的公共的属性和方法;如果还找不到,则基于原型对象上的__proto__继续向上查找。。。直到找到Object.prototype为止
例如:
let arr = [10,20]
console.log(arr.hasOwnProperty('push'))
console.log(Array.prototype.hasOwnProperty('push'))
console.log(arr.__proto__.hasOwnProperty('push'))
console.log(Array.prototype === arr.__proto__)
六,
搞清楚,有时候都是调用的公共方法,但是this的指向不一样,结果也不一样
f2.getY() 和f2.__proto__.getY() ,都是原型对象中的getY()方法,但是this的指向不同