JavaScript
new操作符的原理

new 操作符做了什么

  1. 在内存中创建一个新对象。
  2. 将新对象内部的 proto 赋值为构造函数的 prototype 属性。
  3. 将构造函数内部的 this 被赋值为新对象(即 this 指向新对象)。
  4. 执行构造函数内部的代码(给新对象添加属性)。
  5. 如果构造函数返回非空对象,则返回该对象。否则返回 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;
}