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)