js中的原型链

prototype

每一个函数对象,都有一个prototype属性,这个属性指向函数对象的原型

funtion Person(name){
  this.name = name  
}
Person.prototype.age = 20;
var per1 = new Person('ashen');
var per2 = new Person('xing');
per1.age //20
per2.age //20

在以上代码中,函数的prototype指向了一个对象,而这个对象就是调用构造函数创建的实例的原型。每一个实例对象创建的同时,就会与之关联另一个对象,这个对象就是原型,每个实例对象都会从原型中继承属性。

__proto__

每一个对象(除了null)都有一个__proto__属性,这个属性就指向该对象的原型。

per1.__proto__ === Person.prototype //true

constructor

每个原型对象都有一个constructor属性,指向其构造函数

Person.prototype.constructor === Person //true

而实例对象内部没有constructor属性,但是它继承了原型对象中的constructor,所以

per1.constructor === Person.prototype.constructor //true

Object.getPropertyOf()

获得对象原型的方法

Object.getPropertyOf(per1) === Person.prototype

原型的原型

原型实际上也是一个对象,也可以通过它的构造函数创建,也是该构造函数的实例。原型就也有原型属性。实例的__proto__指向原型的prototype,而原型对象其实就是通过Object构造函数创建的,所以

Person.prototype.__proto__ === Object.prototype // true

原型链

实例对象的__proto__属性指向该原型对象的prototype,而如果该原型对象也有自己的原型,那么该原型对象的__proto__指向自己的原型。因此,一层层嵌套,就形成了原型链

需要注意的是,Object.prototype没有原型

Object.prototype.__proto__ === null //true

以上图中的,person.__proto__ -> Person.prototype   Person.prototype.__proto__ -> Object.prototype就是一条原型链

原文地址:https://www.cnblogs.com/ashen1999/p/12731611.html