new运算符用于创建一个用户定义的对象类型的实例或具有构造函数的内置对象的实例。
var foo = new Foo();
以上文为例,使用new进行构造调用会发生:
- 一个继承自Foo.prototype得新对象被创建。如:
var obj = new Object();
obj.__proto__ = Foo.prototype;
使用指定的参数调用构造函数,并将this绑定到新创建的对象。
如果构造函数没有显式返回对象,则使用步骤1创建的对象为结果。否则,构造函数返回的对象作为new表达式的结果。
根据这三个步骤,可以模拟实现new以理解。由于不能实现一个运算符,只能用函数模拟,newObj函数第一个参数为构造函数,其余参数为传入构造函数的值。
function newObj(){
var Constructor = Array.prototype.shift.apply(arguments);
//分离构造函数和参数
var obj = Object.create(Constructor.prototype);
//步骤1:创建一个继承自函数原型实例的对象 此时obj.__proto__ 为 Constructor.prototype
var result = Constructor.apply(obj, arguments);
//步骤2: 使用指定的参数调用构造函数,并将this绑定到新创建的对象
return typeof result === 'object' ? result || object : object;
//步骤3:如果构造函数没有显式返回对象,则使用步骤1创建的对象为结果。否则,构造函数返回的对象作为new表达式的结果
//result || object 是因为 typeof null 的结果也是 'object'
}