函数的prototype
1.函数的prototype属性
–每个函数都有一个prototype属性,它默认指向一个Object空对象(称为原型对象(构造函数通过prototype和原型对象通过constructor相互引用))
–原型对象中有一个属性constructor,它指向函数对象
2.给原型对象添加属性(一般都是方法)=>实例对象可以访问
–作用:函数的所有实例对象自动拥有原型中的属性(方法)
显式原型和隐式原型
1.每个函数function都有一个prototype,即显式原型(属性),函数的显式原型指向的对象:默认是空的Object实例对象(但Object,Function不满足)
2.每个实例对象都有一个__proto__ 可称为隐式原型(属性),所有函数都是Function的实例(包含Function)
3.对象的隐式原型的值为其对应构造函数的显式原型的值
4.内存结构
5.总结:
–函数的prototype属性,在定义函数是自动添加的,默认值是一个空object对象
–对象的__proto__ 属性,创建对象时自动添加的,默认值为构造函数的prototype属性值
–程序员能直接操作显式原型,但不能直接操作隐式原型(es6之前)
–运行顺序: 定义构造函数=>创造实例对象=>给原型添加方法=>通过实例调用原型的方法
原型链
1.访问一个对象的属性时:
–先在自身属性中查找,找到返回。如果没有,再沿着__proto__这条链向上查找,找到返回。如果最终没有找到,返回undefined(隐式原型链)
Object的原型对象是原型链的尽头
–作用:查找对象的属性(方法)
另(查找变量看作用域链)
2.构造函数/原型/实体对象的关系(图解)
3.构造函数/原型/实体对象的关系2(图解)
所有函数都是Function的实例(包含Function)
function Fun(){} 相当于(var Fun = new Function())
Function = new Function() (所有函数的__proto__ 都是一样的)
4.原型继承
–构造函数的实例对象自动拥有构造函数原型对象的属性(利用原型链)
原型链–属性问题
1.读取对象的属性时:会自动到原型链中查找
2.设置对象的属性值时:不会查找原型链,如果当前对象中没有此属性,直接添加此属性并设置其值
3.方法一般定义再原型中,属性一般通过构造函数定义再对象本身上
instanceof是如何判断的
–表达式 A instanceof B
– 如果B函数的显式原型对象再A对象的原型链上,返回true,否则返回false
–Function是通过new自己产生的实例