原型链小笔记

149 阅读1分钟

1、原型链

var A = function A(){
  var i = 1;
}
var a = new A();
console.log(a.__proto__); // 即构造器function A的原型对象,也是一个对象所以也有__proto__对象
console.log(a.__proto__.__proto__); // 即构造器function object的原型对象
console.log(a.__proto__.__proto__.__proto__); // null

从上图可以看出,实例就是对象,本例子中,a就是实例,A是构造函数,实例是通过new一个构造函数生成的。 实例的__protpo__指向的是原型对象。

那什么是原型链呢?

简单理解就是原型组成的链,对象的__proto__它的是原型,而原型也是一个对象,也有__proto__属性,原型的__proto__又是原型的原型,就这样可以一直通过__proto__想上找,这就是原型链,当向上找直到找到Object的原型的时候,这条原型链就算到头了。

实例和原型链之间的关系

通过一个构造函数创建出来的多个实例,如果都要添加一个方法,给每个实例去添加并不是一个明智的选择。这时就该用上原型了。 在实例的原型上添加一个方法,这个原型的所有实例便都有了这个方法。

var A = function A(){
	var i = 1;
}
var a = new A();
var b = new A();
a.__proto__.say = function(){
	console.log("hello");
}
a.say();
b.say();![](https://p1-jj.byteimg.com/tos-cn-i-t2oaga2asx/gold-user-assets/2018/9/27/16618d9cfd68d35d~tplv-t2oaga2asx-image.image

打印结果:

按照JS引擎的分析方式,在访问一个实例的属性的时候,现在实例本身中找,如果没找到就去它的原型中找,还没找到就再往上找,直到找到。这就是原型链。

and

只有函数有prototype,对象是没有的。

但是函数也是有__proto__的,因为函数也是对象。函数的__proto__指向的是Function.prototype。

也就是说普通函数是Function这个构造函数的一个实例。