JS面试题4——new操作符具体做了什么

  1. 创建了一个空的对象(每一个对象都是由构造函数构建出来的)
javascript 复制代码
<script>
  function Foo(){}
  console.log( new Foo() ); // 打印出了一个空对象
</script>
  1. 将空对象的原型(对象原型)指向构造函数的原型(原型对象)
javascript 复制代码
<script>
  function Foo(){}
  console.log( Foo.prototype == new Foo().__proto__ ); // true
</script>
  1. 将空对象作为构造函数的上下文(改变了this指向)
javascript 复制代码
/* 此时的this代表的是window */
<script>
function Foo(){
  console.log( this );
  this.name = '张三'; // window对象上并没有name
}
console.log( Foo() );
</script>

/* new了之后this就代表new出来的对象了 */
<script>
function Foo(){
  console.log( this );
  this.name = '张三'; // this代表new Foo()这个对象
}
console.log( new Foo() );
</script>
  1. 对构造函数有返回值的处理判断
javascript 复制代码
/* 如果返回的是基本数据的话对结果没有影响,会被忽略 */
<script>
function Foo(){
  this.name = '张三'
  return 11111;
}
console.log( new Foo() ); // 打印出的结果是new出来的对象 Foo {name: '张三'}
</script>

/* 如果返回的是引用类型的数据,那么结果就会使用return返回的数据(new就没用了) */
<script>
function Foo(){
  this.name = '张三'
  return [1,2,3];
}
console.log( new Foo() ); // 打印出的结果是[1,2,3]
</script>
  1. 自己简单实现一下new的过程
javascript 复制代码
/* 官方是通过构造函数new出来的对象 */
<script>
function Fun( age ) {
  this.age = age;
}
console.log( new Fun(18) )
</script>

/* 自己写实现new的效果 */
<script>
function Fun( age,name ) {
  this.age = age;
  this.name = name;
  return 111111;
}
function create( fn, ...args ) {
  console.log( args ); // 此时args就是个数组[18,'张三']
  // 1. 创建一个空对象
  var obj = {};
  // 2. 把空对象的原型指向构造函数的原型
  Object.setPrototypeOf(obj,fn.prototype);
  // 3. 将空对象作为构造函数的上下文(改变this指向)
  var result = fn.apply(obj,args);
  // 4. 对构造函数有返回值的处理判断
  return result instanceof Object ? result : obj;
}
console.log( create(Fun,18,'张三') );
</script>
相关推荐
香芋芋圆2 小时前
AI 冲击内卷之下,普通前端如何破局?WebGIS—— 低门槛突围赛道
前端·javascript·人工智能·学习·职场发展
INS_KF3 小时前
【编程笔记】成员函数中两个 const 的区别(const Data &getData() const;)
前端·javascript·笔记
淡海水3 小时前
07-04-并发-ConcurrentBag-T-工作窃取WorkStealing算法
开发语言·算法·c#·bag·concurrent·workstealing
宿6743 小时前
vue3-async
前端·javascript·vue.js
黄敬峰3 小时前
Agent Memory 进阶:用 LLM 总结压缩上下文,告别"金鱼记忆"
面试
CS_Zero3 小时前
C语言sizeof是函数吗?
c语言·开发语言
YXWik63 小时前
记录前端请求接口在浏览器请求响应的Preview和Response展示的一样的问题
前端
2501_928996224 小时前
GPT-4o换DeepSeek迁移成本多少?中科热备解析API聚合平台技术账本
前端·数据库·人工智能
东风破_4 小时前
从跨域到 WebSocket:前端跨域方案、SSE 与双向实时通信详解
前端·后端
原则猫4 小时前
TS 类型工具
前端