原型链的理解

原型链:就是为了继承而存在的一个方法。它就好像在我身上没有找到特征,就去我的父亲那里找,我父亲那里没找到,就会顺着我爸爸的线索,从我爷爷那里找,依次往上找,直到找到这条线的端点;这里我们像这样找的方法的构成了一条线,有规律的依次往父辈去找,这样的找法就好比原型链一样,原型链就是通过_proto_的方法依次有规律的沿着原型对象找。在这里找的特征就好比属性,方法等,而父亲、爷爷就好比原型对象。

构造函数对象:就是对象的初始化,用来对对象的属性、变量的赋值……的一些操作;通常都是new运算符创建的;构造函数对象里面有一个属性为prototype,它指向了这个构造函数的原型对象。

原型对象:是函数对象的一个属性,里面定义了许多的方法,他可以避免内存的浪费的问题。原型对象里面有一个属性是constrotor,利用constrotor可以找到它的构造函数对象。

_proto_:每一个新建的对象里都有一个属性,就是_proto_,他就好像是寻找原型对象的指南针,所以它是指向原型对象的。

原型链的第一条链:原型对象链

        新建的对象都有一个_proto_,在这个新建的对象上找不到所需要的方法和属性就会沿着图1所示的方向逐级查找。

Person.prototype:这个相当于调用了Person里的prototype属性,prototype又是指向原型对象,所以这里的Person.prototype就相当于原型对象。

    <script>
 
       //构造函数
        function Person(name, age) {
            this.name = name;
            this.age = age;
        }

        //创建构造函数
        var person = new Person('构造函数', 50);

        //原型链之间的关系
        console.log(person.__proto__ === Person.prototype); 
        // true  person对象通过__proto__找到Person原型对象

        console.log(Person.prototype.constructor === Person); 
        // true Person原型对象的constructor指向Person构造函数  

        console.log(Person.prototype.__proto__ === Object.prototype); 
        // true Person原型对象通过__proto__找到Object原型对象(所有的直接量对象都是有Object函数对象构造出来的)

        console.log(Object.prototype.constructor === Object);
        // true Object原型对象的constructor指向Object构造函数

        console.log(Object.prototype.__proto__); 
        // null Object原型对象的指向就是null,意思如果还在Object原型对象里面找不到方法和属性,后面就找不到了。它是最后一个。

    </script>

图1

原型链的第二条链:原型函数链 

    <script>        
        //构造函数
        function Person(name, age) {
            this.name = name;
            this.age = age;
        }
        //创建构造函数
        var person = new Person('构造函数', 50);

        //原型链之间的关系
        console.log(Person.__proto__ ===Function.prototype); 
        // true  Person对象通过__proto__找到Function原型对象(所有的函数对象都是有Function函数构造的)

        console.log(Function.prototype.constructor === Function); 
        // true Function原型对象的constructor指向Function构造函数  

        console.log(Function.prototype.__proto__ === Object.prototype); 
        // true Function原型对象通过__proto__找到Object原型对象(所有的直接量对象都是有Object函数对象构造出来的)

        console.log(Object.prototype.constructor === Object);
        // true Object原型对象的constructor指向Object构造函数

        console.log(Object.prototype.__proto__); 
        // null Object原型对象的指向就是null,意思如果还在Object原型对象里面找不到方法和属性,后面就找不到了。它是最后一个。

    </script>

图2

 原型链的第三条链:Function函数链 

    <script> 
       
        //原型链之间的关系
        console.log(Function.__proto__ ===Function.prototype); 
        // true  Function函数对象通过__proto__找到Function原型对象(有Function构造函数的_proto_是指向他本身的原型对象)

        console.log(Function.prototype.constructor === Function); 
        // true Function原型对象的constructor指向Function构造函数  

        console.log(Function.prototype.__proto__ === Object.prototype); 
        // true Function原型对象通过__proto__找到Object原型对象(所有的直接量对象都是有Object函数对象构造出来的)

        console.log(Object.prototype.constructor === Object);
        // true Object原型对象的constructor指向Object构造函数

        console.log(Object.prototype.__proto__); 
        // null Object原型对象的指向就是null,意思如果还在Object原型对象里面找不到方法和属性,后面就找不到了。它是最后一个。

    </script>

图3

 原型链的第四条链:Object函数链

    <script>

        //原型链之间的关系
        console.log(Object.__proto__ === Function.prototype);
        // true  Object函数对象通过__proto__找到Function原型对象(有Object构造函数也是有Function构造出来的)

        console.log(Function.prototype.__proto__ === Object.prototype);
        // true Function原型对象通过__proto__找到Object原型对象(所有的直接量对象都是有Object函数对象构造出来的)

        console.log(Object.prototype.constructor === Object);
        // true Object原型对象的constructor指向Object构造函数

        console.log(Object.prototype.__proto__);
        // null Object原型对象的指向就是null,意思如果还在Object原型对象里面找不到方法和属性,后面就找不到了。它是最后一个。

    </script>

图4

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值