先附上一张图
通过这张图可以看出,我们声明的构造函数或者类(es6)都会有prototype属性指向原型对象,而这个对象里存放了构造函数的方法等。当我们使用该构造函数创建实例时,那么实例也会有个__proto__属性也指向了这个原型对象。所以该构造函数的所有实例可以不用单独声明就能使用构造函数的方法。
但其实原型对象也有自己的__proto__属性,那么它指向谁呢?
当然是Object,但Object的__proto__属性指向谁呢?
先看张图
function Star() {
this.sing = function () {
console.log("sing");
}
}
function Star1() {
}
Star.prototype.sing = function () {
console.log("唱歌");
}
console.log(Star.prototype.__proto__.constructor);
//Star的原型对象里有个原型属性指向Object的原型对象,然后constructor又指向Object的构造函数
console.log(Star.prototype.__proto__.__proto__);
//输出为null,说明Object原型对象的原型对象是null,可算是绕出来了
var zjl = new Star()
zjl.sing()
//先查看Star对象是否存在sing方法,如果没有则再寻找Star中原型对象是否存在sing方法
var zj = new Star1() //报错,证明该原型对象是属于Star方法
zj.sing()
其中Star构造函数的原型对象的__proto__指向了Object,打开控制台查看Object的__proto__,结果如下图
说明Object的原型是null,既原型链终点。