js基础1.1-关于原型链的理解

74 阅读1分钟

首先,要理解__proto__prototypeconstructorinstanceof几个属性;

  1. prototype:函数独有的,指向一个包含函数所有实例的原型对象的指针;
  2. __proto__:对象独有,指向对象的原型对象,即创建该对象的原型对象的prototype;
  3. constructor:本身作为一个属性,返回创建当前对象的对象;
  4. 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();

f53ca3_720w.jpeg

15932532-cb246befed007789.png