【JavaScript面试题】new操作符具体做了什么?

new操作符具体做了什么?
   function Foo() {

        }
        console.log(new Foo());

结果如下:
在这里插入图片描述
可见我们创建了一个空的对象。

 function Foo() {

        }
        console.log(Foo.prototype == new Foo().__proto__);

结果为
在这里插入图片描述
可见空对象的原型,指向于构造函数的原型。

      function Foo() {
            console.log(this);
            this.name = '张三'
        }
        console.log(Foo());

结果为
在这里插入图片描述
可见this指向的是window,this下是没有name的,所以输出的是undefined.
现在我们new一下

   function Foo() {
            console.log(this);
            this.name = '张三'
        }
        console.log(new Foo());

在这里插入图片描述
由此可见,将空对象作为构造函数的上下文(改变this的指向)

  function Foo() {
            this.name = '张三'
            return 11
        }
        console.log(new Foo());
 function Foo() {
            this.name = '张三'
            return true
        }
        console.log(new Foo());

当返回值为数值或者true的时候,结果均如下。
在这里插入图片描述

 function Foo() {
            this.name = '张三'
            return {}
        }
        console.log(new Foo());

当返回值为一个对象的时候,这时的结果是
在这里插入图片描述

function Foo() {
            this.name = '张三'
            return [1, 2, 3]
        }
        console.log(new Foo());

结果:
在这里插入图片描述

所以说在它内部里面肯定是做了一个判断的。如果这个构造函数返回的是基本类型,则忽略这个返回值,如果返回值是引用类型,则new 就无效了。这就是对构造函数有返回值的判断。

总结
  1. 创建了一个空对象
  2. 将空对象的原型,指向于构造函数的原型
  3. 将空对象作为构造函数的上下文(改变this的指向)
  4. 对构造函数有返回值的处理判断
按照上面的四个步骤如何自己去实现呢?
  function Fun(age) {
            this.age = age;
        }
        console.log(new Fun(18));

在这里插入图片描述
封装一个方法,同样达到上面的效果。

  //封装一个方法去实现new的功能
        function Fun(age, name) {
            this.age = age;
            this.name = name;
        }

        function create(fn, ...args) {
            // 1.创建一个空对象 
            var obj = {}; // var obj=Object.create({})
            // 2. 将空对象的原型,指向于构造函数的原型
            Object.setPrototypeOf(obj, fn.prototype)
              //Object.setPrototypeOf(),为现有对象设置原型,返回一个新对象
              //接收两个参数:第一个是现有对象,第二是原型对象
              
            //3. 将空对象作为构造函数的上下文(改变this的指向)
            var result = fn.apply(obj, args)
                // 4. 对构造函数有返回值的处理判断
            return result instanceof Object ? result : obj;

        }
        console.log(create(Fun, 18, '张三'));

最终的结果
在这里插入图片描述
我们修改返回值

   function Fun(age, name) {
            this.age = age;
            this.name = name;
            return 1111;
        }

结果没有发生任何改变。

 function Fun(age, name) {
            this.age = age;
            this.name = name;
            return {a:1};
        }

在这里插入图片描述
可以看出上述确实达到了new的效果。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

纵有千堆雪与长街

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值