原型和原型链(非深入)

//三个构造函数 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

完!
纯属个人理解,写的不好请见谅,有错误评论改正;
谢谢

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