原生JS实现NEW,带参数

801 阅读1分钟

new的使用方法是 var a = new 构造函数,a就是这个构造函数的一个实例。 放上一张原型链的图

因此需要这个实例a.proto =构造函数.prototype 而我们知道,a是一个对象,创建对象的几种方法中,有一种是Object.create.

var o = Object.create(P)

等同于

o.__proto__ === P//true

因此如何创建a呢,就是

var o = Object.create(func.prototype);

new运算符的步骤 第一步: 一个新的对象被创建。它是继承构造函数的原型对象 第二步: 构造函数被执行。执行的时候,相应的传参会被传入,同时上下文会被指定为这个新的实例。 第三步: 如果这个构造函数返回了一个对象,那么这个对象就是实例的结果,也就是我们的a,如果没有返回对象的,你们new处理的结果为步骤1创建的对象。

因此实现代码:

function New(func) {
    // 创建一个空对象,继承构造函数的原型对象
    var res = Object.create(func.prototype);
    // 执行构造函数,传递上下文和参数
    var ret = func.apply(res, Array.prototype.slice.call(arguments, 1));
    if (typeof ret === 'object' && ret !== null) {
        return ret
    } else {
        return res
    }
}
//测试代码:
function Person(name, age, job) {
    this.name = name;
    this.age = age;
    this.job = job;
    this.sayName = function () {
        alert(this.name);
    };
}
var p1 = New(Person, "Ysir", 24, "stu");
console.log(p1)
var a = New(Array)
console.log(a)