理解js原型prototype

259 阅读2分钟

导读

js的原型问题困扰了我很长时间,一直没有彻底理解其中的内部关系,所以整理了一个脑图来辅助理解,希望对各位读者有所帮助。

原型

函数

function fn(){
    console.log('running fn function');
};

当我们定义了这个函数后,你可以在脑图中找到对应的function fn()函数,来辅助理解。

  • 每一个函数都有prototype属性, 即原型,属性值为一个对象。

  • 每一个对象都有__proto__属性,指向创建该对象的函数的prototype。

typeof fn.prototype === 'object';
fn.prototype.constructor === fn;

构造函数(Function & Object)

这两个构造函数,平时可能接触比较少,但是这两个构造函数才是创建函数和对象的核心。

// Function创建函数
const func = new Function('a', 'b', 'return a + b');

// Object创建对象
const obj = new Object();

A instanceof B

沿着A的__proto__这条线来找,同时沿着B的prototype这条线来找,如果两条线能找到同一个引用,即同一个对象,那么就返回true。如果找到终点还未重合,则返回false。

fn instanceof Function === true
fn instanceof Object === true
Function instanceof Object === true
Object instanceof Object === true
Function instanceof Function === true

上边的表达式我们依次解释

  1. fn instanceof Function === true

fn.__proto__ === Function.prototype

函数即对象,__proto__将指向创建该对象的函数的原型。

  1. fn instanceof Object === true

fn.__proto__ === Function.prototype

Function.prototype.__proto__ === Object.prototype

  1. Function instanceof Object === true

Function.__proto__ === Function.prototype

Function.prototype.__proto__ === Object.prototype

  1. Object instanceof Object === true

Object.__proto__ === Function.prototype

Function.prototype.__proto__ === Object.prototype

Object.__proto__.__proto__ === Object.prototype

  1. Function instanceof Function === true

Function.__proto__ === Function.prototype

Function.__proto__ === Function.prototype

class

ES6中引入了class,让我们在定义类和实现继承时,代码更清晰和简介。class仅仅是一个语法糖,本质上就是构造函数。

class cls{}

typeof cls === 'function'

所以class很多特性和函数都是一致的,通过类实现继承时,需要注意两点。

class A {}
class B extends A {}
  • 子类B__proto__指向父类A
  • 子类B的原型prototype指向父类A的原型prototype

参考文章