如何实现一个new

762 阅读1分钟

最近真的是一点学习和上班的热情都没有,让我一度都觉得自己病了,可是没办法啊,前端搬砖就得努力 啊,今天就来总结一下啦 ~

如何实现一个new

先来总结一下 callapply d的用法吧

call

call 方法第一个参数是要绑定给this的值,后面传入的是一个「参数列表」。当第一个参数为null、undefined的时候,默认指向window。

看一个例子:

输出: My name is Dot Dolby

apply

apply接受两个参数,第一个参数是要绑定给this的值,第二个参数是一个参数数组。当第一个参数为null、undefined的时候,默认指向window。

是不是觉得和前面写的call用法很像,事实上apply 和 call 的用法几乎相同, 唯一的差别在于:当函数需要传递多个变量时, apply 可以接受一个数组作为参数输入, call 则是接受一系列的单独变量。

New

先理清楚 new 关键字调用函数都的具体过程,那么写出来就很清楚了

1.首先创建一个空的对象,空对象的__proto__属性指向构造函数的原型对象
2.把上面创建的空对象赋值构造函数内部的this,用构造函数内部的方法修改空对象
3.如果构造函数返回一个非基本类型的值,则返回这个值,否则上面创建的对象

function _new(fn, ...arg) {
    var obj = Object.create(fn.prototype);
    const result = fn.apply(obj, arg);
    return Object.prototype.toString.call(result) == '[object Object]' ? result : obj;
}

初步完成啦 ~ 有不足的欢迎指导!

下期再会!