您当前的位置: 首页 > 

【03】

暂无认证

  • 2浏览

    0关注

    196博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

new()的认知

【03】 发布时间:2020-12-05 20:54:26 ,浏览量:2

代码1
    function FactoryModel(name,age,sex) {
        var obj = {
            name,
            age,
            sex
        }
        this.obj = obj
        return obj //看这里
    }
    FactoryModel.prototype.printName = function () {
        console.log(this.obj.name)
    }
    var factoryModel1 = new FactoryModel('零三', 18, '男')
	factoryModel1.printName()

然后会发现报错 factoryModel1.printName is not a function

代码2
 function FactoryModel(name,age,sex) {
        var obj = {
            name,
            age,
            sex
        }
        this.obj = obj
        return 1 //看这里
    }
    FactoryModel.prototype.printName = function () {
        console.log(this.obj.name)
    }
    var factoryModel1 = new FactoryModel('零三', 18, '男')
	factoryModel1.printName()

运行并不会报错

观察被new的结果可知

代码1输出 factoryModel1

代码2输出 factoryModel1

总结

根据以上对比差别在于被new的对象,它return的内容是不同的,思索良久,答案就在new底层原理,来看一下new底层执行了什么逻辑

  function _new(fn,...arg) {
        const obj = Object.create(fn.prototype)
        const ret = fn.apply(obj,arg)
        return ret instanceof fn ? ret : obj
    }

显然,这就很明白了

对于ret instanceof fn为true 它返回的是函数本身

而函数有原型属性,后续通过prototype进行挂载的内容可以成功被挂载

对于ret instanceof fn为false的,它则返回obj,而obj并没有prototype,所以导致后续未挂载成功,最后运行的时候就找不到挂载的方法

关注
打赏
1657344724
查看更多评论
立即登录/注册

微信扫码登录

0.0398s