原型链
函数的prototype属性
每个函数都有一个prototype属性,prototype指向一个object空对象,被称为原型对象
function A(){ console.log('我是A函数'); } console.log(A.prototype);
原型对象中有一个constructor属性指向函数
function A(){ console.log('我是A函数'); } console.log(A.prototype); console.log(A.prototype.constructor);
显式原型与隐式原型
每一个function都有一个prototype,即显式原型
每个实例对象都有一个__ proto __,即隐式原型
对象的隐式原型的值为其对应构造函数显式原型的值
用户只能直接操作显式原型,但不能直接操作隐式原型(ES6之前)
function Fn(){ } var fn=new Fn() //fn为Fn的实例对象 //Fn为fn的构造函数
原型链图解
访问一个对象的属性时
- 先在自身查找,找到返回
- 如果没有找到,再沿着__ proto __这条链往上查找,找到返回
- 如果没有找到,返回undefined
别名:隐式原型链
作用:查找对象的属性(方法)
所有的函数(包括object和Function)的__ proto __都一样(所有的函数都是Function的实例对象)
函数的显式原型指向的对象:默认为空的object实例对象(但是object不满足,object指向object的原型对象)
instanceof
怎么判断A instanceof B
如果B函数的显示原型对象在A对象的原型链上,返回true,否则返回false
B沿着显式原型找一次,A沿着隐式原型链一直找
console.log(Function instanceof Function);//true console.log(Object instanceof Function);//true console.log(Function instanceof Object);//true console.log(Object instanceof Object);//true