本文主要讲述的是js中的原型和原型链。
在将js的原型链之前需要先了解一下js中的构造方法,js中(es5),一个方法function通常就是一个构造方法,通常我们会将这个构造方法的首字母大写,用new function来创建一个实例:
function Student(name, age){ this.name = name; this.age = age; } var stu = new Student();在上面的例子中 Student就可以作为一个构造方法。
每个函数都有一个prototype属性,这个属性指向实例原型:
function Student(name, age){ this.name = name; this.age = age; } console.log(Student.prototype);//{constructor: ƒ}函数的实例有一个__proto__属性,这个属性指向实例原型:
function Student(name, age){ this.name = name; this.age = age; } var stu = new Student(); console.log(Student.prototype);//{constructor: ƒ} console.log(stu.__proto__);//{constructor: ƒ} console.log(Student.prototype == stu.__proto__);//true实例原型有个constructor属性,这个属性指向构造函数:
function Student(name, age){ this.name = name; this.age = age; } console.log(Student.prototype.constructor);//ƒ Student(name, age)构造函数,实例,实例原型,它们三者的关系如下图:
其实__proto__一层层的指向就是原型链,最终都会指向null,如下图: 当用.获取对象的属性和方法时,会从对象开始,沿着原型链向上找:
function Student(name, age){ this.name = name; this.age = age; } var stu = new Student(); Student.prototype.type = "student"; console.log(stu.type);//student