手写new详细版

手写new

new操作符做了什么事情:

1.创建一个空对象 将来会返回这个对象

2.调用构造函数,并将构造函数的this指向新创建的对象obj

3.把原型对象的方法给新创建的obj,把obj的__proto__指向构造函数的显式原型

4.判断构造函数的返回值,来决定new的返回值(是构造函数的返回值还是实例化对象)

第一种

function myNew(Func, ...args) {
            // 创建一个空的对象
            const instance = {};
            // 将实例化对象的原型指向构造函数的原型对象
            if (Func.prototype) {
                instance.__proto__ = Func.prototype
            }
            // 将构造函数的this指向实例化对象
            const res = Func.apply(instance, args);
            //判断返回值
            if (typeof res === "function" || (typeof res === "object" && res !== null)) {
                return res;
            }
            return instance
        }

第二种

利用Object.create()方法

1.创建对象

2.将新创建的实例对象原型指向了构造函数

function myNew(Func, ...args) {
       // 创建一个空的对象,将实例化对象的原型指向构造函数的原型对象
       const instance = Object.create(Func.prototype);
       // 将构造函数的this指向实例化对象
       const res = Func.apply(instance, args);
       //判断返回值
       return typeof res === "object" ? res : instance;
}

测试

function Person(name) {
            this.name = name
        }
        Person.prototype.sayName = function () {
            console.log(`My name is ${this.name}`)
        }
        const me = myNew(Person, 'Jack')
        me.sayName()
        console.log(me)
  • 1
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值