JavaScript常见面试题:new的时候做了什么?

分解 new 运算符

  • 创建一个空的简单 JavaScript 对象(即 {});
  • 为步骤 1 新创建的对象添加属性 __proto__,将该属性链接至构造函数的原型对象;
  • 将步骤 1 新创建的对象作为 this 的上下文;
  • 如果该函数没有返回对象,则返回 this

手写一个new

function myNew() {
  const obj = {}

  const args = Array.prototype.slice.call(arguments, 0)

  const ctor = args.shift()

  obj.__proto__ = ctor.prototype

  ctor.apply(obj, args)

  return obj
}

另一个更好理解的版本,善用ES6解构,则不需要做类数组转数组的操作


function myNew(ctor, ...args) {
  const obj = {}

  obj.__proto__ = ctor.prototype

  ctor.apply(obj, args)

  return obj
}

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 1. 什么是对象? 面向对象的三大特性? 对象是属性和方法的集合,面向对象的三大特性是封装,继承,多态 2. 对象...
    小灰灰1010阅读 4,403评论 0 0
  • 常见面试题总结(一) 什么是原型? 原型分为两种:构造函数原型,称为prototype;实例(对象)原型称为pro...
    菩灵阅读 293评论 0 0
  • JavaScript笔试部分 实现防抖函数(debounce) 防抖函数原理:在事件被触发n秒后再执行回调,如果在...
    程序源monster阅读 317评论 1 1
  • java常见面试题及答案 1.什么是Java虚拟机?为什么Java被称作是“平台无关的编程语言”? Java 虚拟...
    littleKang阅读 54,410评论 36 328
  • 基本信息 es6中const定义的属性是否可以改变? 可以的,为什么会这样呢?这是由于对象或者数组属于引用数据类。...
    习惯就好a阅读 8,619评论 0 1