new操作符的实现原理

new操作符的实现原理

new 可以用来实例化一个类,从而在内存中分配一个实例对象。

new操作符的执行过程:

  1. 首先创建了一个新的空对象
  2. 设置原型,将空对象的隐式原型设置为构造函数的 prototype 对象。
  3. 让函数的 this 指向这个新创建的空对象,执行构造函数的代码。为新创建的空对象添加属性。
  4. 判断调用函数过后的返回值类型,如果是基本数据类型,则返回创建的对象。如果是引用类型,就返回这个引用类型的对象。

代码如下

	function _new() {
            //获取第一个参数
            const fn = Array.prototype.shift.call(arguments);
            //获取后面要传入构造函数内的参数
            const args = Array.from(arguments);

            //判断第一个参数是否是一个函数,如果不是抛出类型错误
            if (typeof fn !== 'function') {
                throw new TypeError('a is not a constructor')
            }

            // 新建一个空对象,对象的隐式原型为构造函数的 prototype 对象
            const obj = Object.create(fn.prototype)

            //将构造函数内部的this指向obj,并执行,获取函数返回值
            const result = fn.apply(obj, args)

            //判断函数返回的值是否是引用数据类型
            if (result instanceof Object) {
                //如果是返回该函数的返回值
                return result;
            } else {
                //如果不是就返回obj
                return obj;
            }
        }

        function add(name,age) {
            this.name = name;
            this.age = age;
        }

        add.prototype.say = function () { 
            console.log(`我叫${this.name},今年${this.age}`)
         }

       const test =  _new(add,'马老板',20)
       console.log(test) // add {name: '马老板', age: 20}
       test.say() //我叫马老板,今年20岁
  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值