初面网初面网

new操作符做了什么

可直接参考MDN的定义 new运算符

  1. 创建空对象
  2. 将空对象的原型指向构造函数的原型
  3. 将空对象作为构造函数的上下文(改变this指向)
  4. 构造函数有返回值,需判断并按条件返回(基本类型忽略,引用类型相当于没有new)

分步验证


// 1、创建空对象
function newFunc(){}
console.log(new newFunc())

// 2、将空对象的原型指向构造函数的原型
console.log(newFunc.prototype == new newFunc().__proto__)

// 3、将空对象作为构造函数的上下文(改变this指向)
function newFunc2(){
  console.log(this)
}
console.log(newFunc2())
console.log(new newFunc2())

// 4、对构造函数有返回值,需判断并按条件返回
function newFunc3(){
  return 1111
}
console.log(new newFunc3())

function newFunc4(){
  return [1,2,3]
}
console.log(new newFunc4())

function newFunc5(){
  return {"name": "tom", "age": 18}
}
console.log(new newFunc5())

自制new操作

function myNew( fn, ...args ){
  var obj = {}; // var obj = Object.create({})
  Object.setPrototypeOf(obj, fn.prototype);

  var result = fn.apply(obj, args);
  return result instanceof Object ? result : obj;
}

更新于 2025/2/26