Js原型链深入理解和总结之三

如果你读过之前的两篇文章,就会对原型链和原型方法有一定的理解。
下面这篇文章是对原型链最重要的总结
学习原型链是必须要有一个基本的概念:所有的对象都是Object的实例。 而所有的实例的__proto__都指向函数原型,即所有的实例和对象的__proto__属性都指向了Object的原型prototype属性
下面附上代码和图片进行理解:
在这里插入图片描述这是我在学习期间一直很有用的图。那么就根据图上的指向我们来用代码验证一下。

function Foo() { }
//首先创建来个实例
var f1 = new Foo()
var f2 = new Foo()

实例最底层指向大家应该都很清楚,这没有什么难的,
f1实例的隐式原型__proto__指向函数显式原型prototype
显式原型的constructor属性指向构造函数本身

console.log( f1.__proto__ === Foo.prototype) //true
console.log(Foo.prototype.constructor === Foo) //true

那么构造函数Foo是本质上也是一个函数,而所有的函数都是Function的实例,所以构造函数和函数类型之间有一条原型链。构造函数Foo的隐式原型指向了 Function的显式原型,既然存在 Function的显示原型,那么必然存在constructor属性指向构造函数.

//构造函数Foo的隐式原型指向了 Function的显式原型
console.log(Foo.__proto__ === Function.prototype) //true
// 我们将Function的构造函数输出来看看是什么
console.log(Function.prototype.constructor) //[Function: Function]
``

一定要能区别开这两特殊的对象。
**Object和Function既是对象,又是函数,两者内部同时含有proto和prototype属性,他们关系较为复杂,以下做归纳。*。

console.log(Object.__proto__ === Function.prototype)  //true
console.log(Object.__proto__ === Function.__proto__)	//true
console.log(Object.prototype === Function.prototype.__proto__) 	//true

// 一般可以做类型对比区别,因为原型指向一致,所有instanceof操作符默认相等
console.log(Function instanceof Object) //true

请仔细对比代码与图中原型链的位置,如果不能理解,请记住!!

原型链的终端
在原型链的终端一定是Object.prototype实例。
所有的实例和函数的原型链最终端一定是如此

//请跟着上图原型链查找
console.log(f1.__proto__.__proto__ === Object.prototype)  //true
console.log(Function.prototype.__proto__ === Object.prototype) //true

那么Object.prototype指向哪里?一定指向的是NULL

console.log(Object.prototype.__proto__ === null) 	//true
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值