谈谈令人头大的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(尽头);

 

转载于:https://www.cnblogs.com/MikePan/p/9216482.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值