原型和原型鏈(非深入)

//三個構造函數 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

完!
純屬個人理解,寫的不好請見諒,有錯誤評論改正;
謝謝

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章