首先,要理解__proto__
、prototype
、constructor
、instanceof
几个属性;
prototype
:函数独有的,指向一个包含函数所有实例的原型对象的指针;__proto__
:对象独有,指向对象的原型对象,即创建该对象的原型对象的prototype;constructor
:本身作为一个属性,返回创建当前对象的对象;instanceof
:用来检测当前对象的__proto__是否指向创建它的对象的prototype,返回一个boolean值;
什么是原型链
在JavaScript中,万物皆对象,所有对象都有__proto__
属性,也有对应的原型(除了null
),一个对象的__proto__
属性,会指向它本身的原型对象,而原型对象,也有__proto__
属性指向原型对象的原型对象,这些原型最后指向基础数据类型Object
对象的原型Object.prototype
(当然这个原型也有__proto__,指向null),这个由__proto__
属性将对象和原型串联起来的过程,就是原型链;
当一个获取一个对象的属性时,会先从对象本身中查找,若无则会顺着它的原型链查找它的原型是否有该属性,直至null,例:
let a = {a:1,b:2};
a.__proto__.c=3;
console.log(a.c) //3
instanceof判断对象是否在另一个对象的原型链上
var A = function(){};
var a = new A()
a instanceof A //判断a是否在A的原型链上,返回true
a.prototype.constructor == a // 返回true
a.__proto__ = {}
a instanceof A //将a的原型指向空对象,则instanceof判断a不在A的原型链上,返回false
原型链的关系图,Foo是构造函数,b、c是Foo的实例,代码实现如下
function Foo() {}
var b = new Foo();
var c = new Foo();