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>
相关推荐
禁默5 分钟前
深入浅出:AWT的基本组件及其应用
java·开发语言·界面编程
Cachel wood11 分钟前
python round四舍五入和decimal库精确四舍五入
java·linux·前端·数据库·vue.js·python·前端框架
学代码的小前端13 分钟前
0基础学前端-----CSS DAY9
前端·css
Code哈哈笑14 分钟前
【Java 学习】深度剖析Java多态:从向上转型到向下转型,解锁动态绑定的奥秘,让代码更优雅灵活
java·开发语言·学习
joan_8517 分钟前
layui表格templet图片渲染--模板字符串和字符串拼接
前端·javascript·layui
程序猿进阶17 分钟前
深入解析 Spring WebFlux:原理与应用
java·开发语言·后端·spring·面试·架构·springboot
qq_4336184420 分钟前
shell 编程(二)
开发语言·bash·shell
charlie11451419134 分钟前
C++ STL CookBook
开发语言·c++·stl·c++20
袁袁袁袁满34 分钟前
100天精通Python(爬虫篇)——第113天:‌爬虫基础模块之urllib详细教程大全
开发语言·爬虫·python·网络爬虫·爬虫实战·urllib·urllib模块教程
还是大剑师兰特40 分钟前
什么是尾调用,使用尾调用有什么好处?
javascript·大剑师·尾调用