首先要明确几个事情:
prototype和__proto__
1.prototype:
每个函数都会有一个prototype这个属性,这个属性是一个指针,它指向一个对象,这个对象就叫做原型对象;
原型对象也是一个对象它是由Object创建出来的实例!!!切记!!它也有__proto__,指向Object.prototype,而Object.prototype自己也是一个原型对象别的原型对象的__proto__都指向它
那么它自己怎么办呢?它自己也不知道怎么办,所以它就懵逼了,指向了null,到这里就来到了原型链的终点了!!!!
2.__proto__:
每个对象都有一个__proto__,它指向创建它的那个构造函数的原型对象,有点绕啊!!而函数也是一个对象,(切记js里万物皆是对象这句话!!!)但是呢每个函数也都是一个对象
你可以把函数理解成一个特殊的对象,它比较厉害,它不光有普通对象的__proto__,它还有自己独有的prototype,普通的对象是没有prototype的!!!!
3.String Array Object Function Date RegExp 。。。这些鬼东西其实都是构造函数啊!!!有点坑,他们都是由Function构造出来的包括Function自己,所以只要是函数都有prototype还有__proto__.
总之记住一句话:每个对象都有一个__proto__,它指向创建它的那个构造函数的原型对象!!!!
明白了这些就来做几道题目绕啊绕啊就忽然茅塞顿开啦!
function Fn(){}
var f1=new Fn();
console.log(f1.__proto__===Fn.prototype)//true 指向创建自己的那个构造函数的原型对象
console.log(Fn.__proto__===Function.prototype) //true 所有构造函数是函数对象,他们都是Function 的实例所以指向Function 的原型对象
console.log(Function.__proto__===Function.prototype)//true Function本身也是一个构造函数,他自己的__proto__也是指向自身 的原型对象
console.log(Function.prototype.__proto__===Object.prototype)//所有构造函数的原型对象的__proto__指向Object的原型对象,因为Object是这个原型对象的构造函数
console.log(Object.prototype.__proto__)//null
console.log(Array.__proto__===Function.prototype)//所有的内置函数都是构造函数,也是Function 的实例,所以 他们的__proto__指向Function的原型对象
console.log(Function.prototype instanceof Object)//Function 这个构造函数的原型对象是Object的实例,是由它创建出来的 ,也就是说Object 是Function.protype
//的构造函数!!!所有的原型对象的构造函数都是Object,所以所有构造函数的__proto__都指向Function.prototype
console.log(Object.__proto__===Function.prototype)*/
强化练习:
var obj={}
//console.log(obj.__proto__.__proto__===null) //true obj.__proto__指向Object.prototype ,Object.prototype 的__proto__指向null
//console.log(obj.__proto__.constructor===Object) //true obj.__proto__指向Object.prototype ,Object.prototype的constructor指向Object
//console.log(obj.__proto__.constructor.__proto__===Function.prototype) //true 根据上一题得知本题相当于 Object.__proto__;而 所有构造函数的__proto__指向Funcion的原型对象
//console.log(obj.__proto__.constructor.__proto__.__proto__===Object.prototype) //true 本题相当于 Function.prototype.__proto__所以根据所有原型对象都是Object的实例得知为Object.prototype
// console.log(obj.__proto__.constructor.__proto__.__proto__.__proto__===null) //true 根据上一题本题相当于Object.prototype.__proto__ 只有这个原型对象Object.prototype例外 它指向null 原型链的终点
//console.log(obj.__proto__.constructor.__proto__.__proto__.constructor.__proto__===Function.prototype) //true
总结一下吧:
//1. Function的__proto__指向其构造函数Function的prototype;
//
//2. Object作为一个构造函数(是一个函数对象!!函数对象!!),所以他的__proto__指向Function.prototype;
//
//3. 所有构造函数的的prototype方法的__proto__都指向Object.prototype(除了....Object.prototype自身);
//
//4. Object.prototype的__proto__指向null(尽头);