原型链补充

2018-06-12  本文已影响0人  Vampire丶_L

通过近期的一次笔试发现我对原型链的一些属性掌握的不是很好,所以再来写一片文章补充;

关于__proto__属性

下面的请谨记
1,每个对象都有名为__proto__属性
2,每个对象的__proto__属性都指向自身构造函数的prototype
来看代码:

        function func(){};
        var f1 = new func();

        //f1是func的实例,所以f1的__proto__指向func的原型对象
        console.log(f1.__proto__ === func.prototype);//true

        //func的__proto__指向定义它的Function.prototype
        console.log(func.__proto__ === Function.prototype);//true

        //Function由自身构造
        console.log(Function.__proto__ === Function.prototype);//true
        //由上面三个 true可知所有构造函数的__proto__

        //prototype也是对象,所以它的__proto__指向Object.prototype 
        console.log(Function.prototype.__proto__ === Object.prototype);//true
        console.log(func.prototype.__proto__ === Object.prototype);//true 
        //由这两行可知:所有构造函数的prototype的__proto__都指Object.prototype
  
        //Object也是构造函数,所以同上构造函数的__proto__ 指向Function.prototype
        console.log(Object.__proto__  === Function.prototype)//true  

        //Object.prototype作为最终的源头,它的__proto__是null
        console.log(Object.prototype.__proto__ === null);//true
        var  a = {};
        
        //由于a是以字面量方式创建的对象,所以不需要经过Function,a.__proto__属性直接指向Object.prototype
        console.log(a.__proto__ === Object.prototype)
        console.log(a.__proto__.__proto__ === null);//true
        console.log(a.__proto__.constructor === Object);//true
        console.log(a.__proto__.constructor.__proto__ === Function.prototype);//true
        console.log(a.__proto__.constructor.__proto__.__proto__ === Object.prototype);//true
        console.log(a.__proto__.constructor.__proto__.__proto__.__proto__ === null);//true
 console.log(a.__proto__.constructor.__proto__.__proto__.constructor.__proto__ === Function.prototype);//true

最后附上一张图:


1030655-20161031041705971-1605480841.jpg
上一篇下一篇

猜你喜欢

热点阅读