首先来理清楚原型链里面的prototype和__proto__这两个要素,下面来一个例子
<script>
function Person() {
this.name = "xiaomi";
}
let person1 = new Person();
console.log(person1.name); // xiaomi
person1.name = "NewName";
console.log(person1.name); // NewName
</script>
上面的例子中,创建了一个构造函数Person,person1调用Person的构造函数创建了一个新的实例。那么person1的内部属性指针( __proto__ )就是指向构造函数Person的原型对象(prototype);如何证实这个指向的正确性呢?我们可以通过isPrototypeOf方法来做一个检测。
console.log(Person.prototype.isPrototypeOf(person1)) // true
如果返回true的话,则两者的指向关系(person1的__proto__指向Person.prototype)成立。
当调用person1的属性name时,首先会在person1对象本身中进行搜索,如果找到了,就返回该属性相应的值;如果没有找到,则根据person1的内部指针属性,往上一级进行搜索,如果还是没找到,还是会继续往上一级进行搜索,一直到该实例对象的最顶端的原型对象,到最后都是没有找到就会返回null。这一个过程,我们称之为原型链。
该文章例子为本人理解js原型链所写,如描述不到位还望指正。