new 操作符做了什么
- 在内存中创建一个新对象。
- 将新对象内部的 proto 赋值为构造函数的 prototype 属性。
- 将构造函数内部的 this 被赋值为新对象(即 this 指向新对象)。
- 执行构造函数内部的代码(给新对象添加属性)。
- 如果构造函数返回非空对象,则返回该对象。否则返回 this。
// 使用 var 避免兼容性问题
function myNew(func) {
// 创建一个空对象,并且指定原型为func.prototype(obj.__proto__ === func.prototype)
var obj = Object.create(func.prototype);
var args = Array.prototype.slice.call(arguments, 1);
// 执行构造函数,并且将this指向obj
var res = func.apply(obj, args);
// 返回新对象
return res instanceof Object ? res : obj;
}
function Person(name, age) {
this.name = name;
this.age = age;
}
var person = myNew(Person, "name", 18);
// ES6
function myNew(func, ...args) {
// 创建一个空对象,并且指定原型为func.prototype(obj.__proto__ === func.prototype)
var obj = Object.create(func.prototype);
// 执行构造函数,并且将this指向obj
var res = func.apply(obj, args);
// 返回新对象
return res instanceof Object ? res : obj;
}