JS原型及原型链理解

一、原型

        每个函数都有一个prototype属性,该属性指向一个对象。

        每个引用类型都有一个__proto__属性,该属性指向其构造函数的prototype。

        引用类型的没有prototype属性,该属性仅函数拥有。

    function Preson(name,age,sex){
        this.name = name;
        this.age = age;
        this.sex = sex;
    } 
    var men = new Preson();
    console.log(men.__proto__ === Preson.prototype);//true
    console.log(men.prototype);//undefined

二、原型链

    function Preson(name,age,sex){
        this.name = name;
        this.age = age;
        this.sex = sex;
    } 
    Preson.prototype.men = "男人";
    var xy = new Preson("咸鱼",120,"男");
    console.log(xy);
    console.log(xy.men);//打印:男人

                当我们这样定义时,men这个属性无法在xy的正常属性里找到,原因在于该属性被定义在隐式原型里,但是我们却可以直接访问这个属性,原因在于我们查找引用类型的某个属性或者方法时,会在自身的属性里优先查找,如果不存在,则会去它的隐式原型(__proto__)上查找,相当于构造器Preson__proto__,如果还不存在,则会去Preson的构造函数里的prototype__proto__里查找,像这样顺着向上查找原型称为原型链,这样的查找会持续到Object.prototype.__proto__结束,此时的结果为null,如果查到到null还没有找到说明该方法或者属性不存在,返回undefined。

    Preson.prototype.men = "男人";
    //构造函数Preson的隐式原型包含了men属性,而xy由Preson构造,所以xy的__proto__包含men属性
    console.log(xy.__proto__.men === xy.men);//true

 

    Object.prototype.men = "男人";
    //Object是Preson的构造函数,所以当xy调用men属性时,相当于调用了Prenson的构造Object里__proto__的men属性
    console.log(Object.__proto__.men === xy.__proto__.__proto__.men);//true

(个人理解,如有错误欢迎指正) 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值