jerryni / blog

:dog: :dog: :dog:
https://github.com/jerryni/blog/issues
11 stars 4 forks source link

js基础之原型链 #35

Open jerryni opened 3 years ago

jerryni commented 3 years ago

前面介绍过了js原型的发展史,下面说的是js里的原型链:

官方是这么描述的: prototype chain

这段话还是有点难理解的,我们直接从代码的角度对这些话进行拆分,然后尝试理解一下:

// 构造函数
function Person() {}

// 每个构造函数都有一个原型对象
console.log(typeof Person.prototype); // "object"

// 原型对象都包含一个指向构造函数的指针
Person.prototype.constructor === Person; //true

var p1 = new Person();

// 实例都包含一个指向原型对象的指针(浏览器为了方便调试将对象的__proto__的私有指针暴露了出来)
p1.__proto__ === Person.prototype; // true 

假如我们让原型对象等于另一个类型的实例(这句话其实就是继承的实现方法):

// 让Women继承Person
function Women() {}
Women.prototype = new Person();

// 此时原型对象将包含另一个原型对象的指针
Women.prototype.__proto__ === Person.prototype // true;

那么, Object和Person又是什么关系呢?

// 由于Person的原型是没有指向另一个类型的实例的, 所以猜想默认应该是指向了Object的实例

Person.prototype.__proto__ === Object.prototype; //true, 猜想是正确的!!!

综上所述, 便形成了一条 Women => Person => Object的实例与原型的链条,就是原型链啦!

这时候再回去读一下书上那段话,看你理解了没有~

话外的原型链

pic

从上图中可知以下几点:

自定义函数(Foo)和内置Object, Function的关系:

自定义对象(obj)和Object的关系:

内置Function和Object的关系:

原型链的终点是null:

Object.prototype.__proto__ === null;

参考资料

javascript高级程序设计(第三版) JavaScript权威指南(第六版)

winter的原型链深究: http://www.cnblogs.com/winter-cn/archive/2009/05/16/1458390.html