先看一个基于构造函数+原型链模式下的创建的函数的形式
function Person(name,age){
this.name=name;
this.age=age
}
Person.prototype.getName=function(){
return this.name;}
再来了看一下一个new操作符需要完成那些事?
- 创建一个对象
- 在新创建的对象作用域下执行构造函数
- 返回对象
实现new操作符
定义new函数,参数的数量我们是不知道的,我们也不必得到精确的映射
function new(){}
实现第一步,创建一个对象,由于不能使用new方法,需要去找寻是否有合适的函数去辅助我们
Object.create() 创建一个新对象,使用现有的对象来提供新创建的对象的__proto__。
正好帮我们省去了将构造函数的原型添加到新对象上
Object.create(func.prototype)
第二步调用构造函数并且修改this指针
fun.apply(newObj, Array.prototype.slice.call(arguments, 1))
由于手写的形式不像new操作符那样,他的参数传递形式为
new1(Person,'wx','21')
第三步是返回这个新创建的对象
完整的代码
function new1(func) {
var newObj = Object.create(func.prototype);
var returnObj = func.apply(newObj, Array.prototype.slice.call(arguments, 1));
return newObj;
}