JavaScript中的原型
1、显式原型
function Fn(){
}
Fn.prototype.test=function(){}
/*
1、这个prototype就是显式原型
2、函数方法(对象)可以直接操作显式原型,给其原型对象添加属性或者方法
*/
2、隐式原型
function Fn(){
}
var fn = new Fn()
console.log(fn.__proto__)
/*
1、这个__proto__就是隐式原型
2、在ES6之前,隐式原型不能给原型对象添加属性或者方法
3、如果实例化对象在使用方法时,找不到对应方法和属性,则会直接去原型对象上找
4、如果始终没找到,则为undefined
*/
3、原型链
详细解释请看下方
简单的总结:
1、所有函数方法都是Function的实例对象,因此函数方法的__proto__都是Function
2、所有实例对象里面都要内部的__proto__都要创建一个空的Object对象,因此实例对象的__proto__都指向Object的实例对象
3、Object实例对象和的__proto__指向的是null,表示原型链的尽头
我们都知道__proto__都是指向父亲的原型对象的,而prototype则是函数和方法中特有的对象,它也指向自身的实例对象,根据这个我们就可以读懂上面那个图:
1、Foo是Foo()的原型对象,因此Foo的prototype指向Foo实原型
2、Foo原型对象中又创建一个空的Object对象,因此__proto__指向Object原型对象,
3、Foo()是一个函数,因此肯定是函数的实例化对象,因此Foo()的__proto__是Function
4、然后js有一个特殊的操作,就是var Function = new Function(),因此Function的prototype的prototype和Function()的__proto__指向相同
5、Object()是一个函数,因此他的__proto__是Function
6、Function中创建了一个空的Object对象,因此Function的__proto__指向Object原型对象