//三个构造函数 A B C
function A() {
this.name = "睿睿"
}
function B() {
this.age = '19'
}
function C() {
this.gender = '男'
}
//接下来要注意,以当前的例子来说,必须先B的原型是C的实例然后再A的原型是B的实例;否则A只会继承B,不会继承C;
//B的原型是C的实例
B.prototype = new C();
//A的原型是B的实例
A.prototype = new B();
//a是A的实例
var a = new A();
console.log(a.name) //睿睿
console.log(a.age) //19
console.log(a.gender) //男
//由于实例对象继承(上文中的A,B也继承自C)了原型对象的属性,所以a也拥有constructor,也指向原型对象对应的构造函数
//原型对象的constructor指向其构造函数
console.log(a.constructor) //构造函数C
console.log(a.__proto__.__proto__.constructor) //构造函数C
console.log(a.__proto__.constructor) //构造函数C
console.log(A.prototype.constructor)//构造函数C
console.log(B.prototype.constructor)//构造函数C
//构造函数的prototype指向其原型对象
console.log(A.prototype) //一个包含age:19的对象
//实例对象的__proto__指向其原型对象
console.log(a.__proto__) //一个包含age:19的对象----等同于console.log(A.prototype)
//所以:
console.log(A.prototype === a.__proto__) //true
//构造函数也有一个 __proto__ 指向 Object 这个构造函数的原型对象,Object 通过 prototype 指向自己原型对象 ;一层一层的往下指,当Object 没有__proto__时,说明它已经到底了,没有下一层了,这个时候__proto__指null;
console.log(a.__proto__.__proto__.__proto__) //null
console.log(A.prototype.__proto__.__proto__) //null
console.log(a.__proto__.__proto__.__proto__ === A.prototype.__proto__.__proto__) //true
完!
纯属个人理解,写的不好请见谅,有错误评论改正;
谢谢