一张图彻底理解Javascript原型链

代码

讲解用到的代码很简单,如下

function Foo(){
    //属性和方法
}
var f1 = new Foo();
var f2 = new Foo(); 
var o1 = new Object();
var o2 = new Object();

基础了解

一切皆对象,对象又可以分为两类:

  • 普通对象 ,除了函数对象之外的对象都是,包括new函数对象()产生的实例,普通对象没有prototype,也就没有继承和原型链一说。
  • 函数对象 ,包括两种:
    • 由function创造出来或者new Function()的函数:
            function f1() {
      	  } // 匿名函数
      	  var f2 = function() {
      	  }
      	  var f3 = new Function('x','console.log(x)');
      	  // 以上都是函数对象
      
    • 系统内置的函数对象:Function、Object、Array、String、Number ,Function其实充当了函数对象的构造器,比如Object对象的构造源码其实是Function Object() {[native code]}的形式,这一点对于理解原型链很重要。

进入正题

在这里插入图片描述
上图从结构上分为实例对象、Functions函数对象、prototype原型对象三部分,图中f1、f2的原型链我特意标成了红色,Foo的原型链为紫色。

每个对象都有__proto__属性,用于储存继承得来的方法和属性;每个函数对象都有prototype属性,用于继承,将其中定义的属性和方法传递给‘后代’(比如实例化)。

如何实现原型继承

f1为何有Foo、Object的原型方法,其实就是通过原型链继承。继承的过程可以表示为 f1.proto = Foo.prototype,即对象.proto = 构造器.prototype。

new实例实现继承的过程其实与上面原理相同,new的过程可以拆解为下面几个步骤:

var temp = {};
temp.__proto__ = Foo.prototype; // 原型继承
var f1 = Foo.call(temp);
return f1;

找出原型链

1 f1的原型链(红色虚线)
  • f1为普通对象,它的构造器为Foo,以Foo为原型,原型链第一链为f1.proto == Foo.prototype;
  • Foo.prototype(注意这边不是Foo)为json对象,即普通对象,构造器为Object,以Object为原型,得出原型链第二链Foo.prototype.proto == Object.prototype;
  • Object.prototype以Null为原型,原型链第三链为Object.prototype.proto == null;

f1的原型链可以用图形表示:
在这里插入图片描述
可以在浏览器console打印验证:
在这里插入图片描述

2 Foo的原型链(紫色虚线)
  • Foo为函数对象,它的构造器为Function,以Function为原型,原型链第一链为Foo.proto == Function.prototype;
  • Function.prototype为json对象,即普通对象,构造器为Object,以Object为原型,原型链第二链为Function.prototype.proto == Object.prototype;
  • 最后Object.prototype以Null为原型,原型链第三链为Object.prototype.proto == null;

Foo的原型链可以用图形表示为:
在这里插入图片描述
可以在浏览器console打印验证:
在这里插入图片描述

3 小结

列出两种原型链的目的是:
当js引擎执行对象的属性或方法时,先查找对象本身是否存在该方法,如果不存在则会在原型链上查找。

因而f1拥有Foo、Object的原型方法,Foo拥有Function、Object的原型方法。

注意,虽然f1原型链其中有一链是涉及到函数对象Foo,但f1并不拥有Function的原型方法,因为原型链并没有延伸到Function。

比如下图中bind是Function的原型方法,f1并没有拥有。
在这里插入图片描述

总结

如何找出一个对象的原型链,只需要两步

判断对象是普通对象还是函数对象,得出对象的构造器
对象.proto == 构造器.prototype

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值