首先需要去搞懂new运算符背后的原理,当new Object()时具体发生了什么。
举一个简单的例子:
function foo(){
}
var obj = new foo()
那么这句代码到底做了什么工作呢,可简述为以下
- 创建一个空对象obj,它继承于foo.prototype
- 构造函数foo被执行,上下文(this)被指定给新的对象obj
- 返回新创建的对象obj
由于foo中没有参数设置,所以忽略了参数传递的过程。
通过这个简单的例子,new运算符的过程为
- 创建一个新的对象
- 将构造函数的作用域赋给新对象
- 执行构造函数中的代码(为新对象添加属性)
- 返回新对象(若构造函数返回值为一个对象时,那么这个对象将会取代整个new出来的结果)
var _new = function(func, ...arg){
//创建构造函数的原型对象的实例
var o = Object.create(func.prototype)
//改变构造函数的this指向
var k = func.apply(o, arg)
if(typeof k === 'object'){
return k
}else{
return o
}
}
//构造函数
function M(name, age, sex){
this.name = name
this.age = age
this.sex = sex
}
var o = _new(M, "zhangsan", 13, "m")