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>
相关推荐
tang7778920 分钟前
爬虫如何绕过绕过“5秒盾”Cloudflare:从浏览器指纹模拟到Rust求解之不完全指南
开发语言·爬虫·rust·cloudflare
Yuer202524 分钟前
什么是 Rust 语境下的“量化算子”——一个工程对象的最小定义
开发语言·后端·rust·edca os·可控ai
2501_9481953426 分钟前
RN for OpenHarmony英雄联盟助手App实战:符文配置实现
javascript·react native·react.js
hqwest27 分钟前
码上通QT实战26--系统设置01-系统设置布局
开发语言·qt·qss·qt基础控件·qt布局控件·qt表格控件
薛定谔的猫198228 分钟前
llama-index Embedding 落地到 RAG 系统
开发语言·人工智能·python·llama-index
小目标一个亿32 分钟前
Windows平台Nginx配置web账号密码验证
linux·前端·nginx
007php00735 分钟前
mySQL里有2000w数据,Redis中只存20w的数据,如何保证Redis中的数据都是热点数据
数据库·redis·git·mysql·面试·职场和发展·php
rocky19138 分钟前
网页版时钟
前端·javascript·html
Aotman_1 小时前
Element-UI Message Box弹窗 使用$confirm方法自定义模版内容,修改默认样式
linux·运维·前端
计算机程序设计小李同学1 小时前
基于SSM框架的动画制作及分享网站设计
java·前端·后端·学习·ssm