谈谈令人头大的prototype 和__proto__

首先要明确几个事情:

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(尽头);

 

posted @ 2018-06-23 10:20  青埂峰下  阅读(241)  评论(0编辑  收藏  举报