new 运算符接受一个构造器
和一组调用参数
,实际上做了几件事:
- 以构造器的prototype属性为原型,创建新对象;
- 将this和调用参数传给构造器,执行;
- 如果构造器返回的是对象,则返回,否则返回第一步创建的对象。
function create() {
// 1.创建一个全新的对象
let obj = new Object();
//获取构造函数
let Con = [ ].shift.call(arguments);//拿到第一个元素
// 2.将对象的__proto__指向构造函数的prototype对象
obj.__proto__ = Con.prototype;
//使用新的api obj = Object.setPrototypeOf(obj,Con.prototype);
// 3.绑定this, 以及参数;
let result = Con.apply(obj,arguments)
//4.确保返回的是对象(如果构造器没有返回其他对象,则自动返回这个新对象)
return typeof result === 'object' ? result : obj;
}
function create(){
//获取构造函数
let Con = [].shift.call(arguments);
//以构造函数为原型创建一个新对象
let obj = Object.create(Con);
//绑定this及其参数
let result = Con.apply(obj,arguments);
return typeof result === 'object'? result:obj;
}