//三個構造函數 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
完!
純屬個人理解,寫的不好請見諒,有錯誤評論改正;
謝謝