简单实现一个new

本文深入探讨JavaScript中new操作符的工作原理,通过实现一个自定义的new函数来理解其内部机制。讲解了如何创建新对象、设置构造函数、原型链连接以及构造函数的执行逻辑。同时,文章还提到了数组方法如shift和call的应用,以及arguments对象的转换技巧。
摘要由CSDN通过智能技术生成
 // 实现一个new操作符
    function myNew() {
        // 创建一个新对象obj
        let obj = new Object();
        // 取参数的第一项为构造函数fn,这里可以写(arguments,1)也可以直接(arguments),都是代表参数的第一项,取构造函数
        let fn = [].shift.call(arguments);

        // 将obj.__proto__连接到构造函数fn的原型
        obj.__proto__ = fn.prototype;
        // result接收构造函数执行后的返回结果
        let result = fn.apply(obj, arguments);
        // 如果构造函数返回一个对象,则将该对象返回,否则返回步骤1创建的对象
        return typeof result === 'object' ? result : obj;
    }
//测试
    function Person(name) {
        this.name = name;
    }

    var p2 = myNew(Person, "小明");
    console.log(p2.name);

解释:

1、let fn = [].shift.call(arguments);

[] 可以替换为 Array.prototype
shift:方法原理就是根据传入的参数(值)对原数组(或者类数组)进行遍历获取,赋给新数组然后返回。如果没有参数便复制整个原数组(或者类数组),后赋给新数组然后返回。
call:第一个参数都是一个对象或者 ‘this’ 注意this加引号了, apply第二个参数接收一个数组,call则不是,call可以有n个参数有多少放多少就行。

重点
slice内部实现是使用的this代表调用对象,那么当[].slice.call() 传入 arguments对象的时候,通过 call函数改变原来 slice方法的this指向, 使其指向arguments,并对arguments进行复制操作,而后返回一个新数组。至此便是完成了arguments类数组转为数组的目的!

其实这可以理解为,让类数组调用数组的方法!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值