JS 手写 new 函数

工作中我们经常会用到 new 关键字,new 一个构造函数生成一个实例对象,那么new的过程中发生了什么呢,我们今天梳理下

  1. 创建一个对象
  2. 对象原型继承
  3. 绑定函数this
  4. 返回对象

先创建一个构造函数,原型上添加一个方法

javascript 复制代码
let Foo = function (name) {
  this.name = name
}

Foo.prototype.getName = function () {
  return this.name
}

然后,我们实现一个自定义new函数:

javascript 复制代码
function new_(fn, ...args) {
  let obj = {} // 创建一个对象
  obj.__proto__ = fn.prototype // 继承函数的原型
  fn.apply(obj, args) // 绑定this
  return Object.prototype.toString.call(obj) === '[object Object]' ? obj : {} // 返回对象,判断其有效性
}

使用,看下效果

javascript 复制代码
let foo = new_(foo, '张三')

console.log(foo)
console.log(foo.getName())

打印看下,看到完美输出

相关推荐
lly20240629 分钟前
jEasyUI 设置排序指南
开发语言
一起努力啊~40 分钟前
算法刷题--长度最小的子数组
开发语言·数据结构·算法·leetcode
拾荒的小海螺1 小时前
开源项目:Three.js 构建 3D 世界的工具库
javascript·3d·开源
还债大湿兄1 小时前
huggingface.co 下载有些要给权限的模型 小记录
开发语言·前端·javascript
叶落无痕521 小时前
Electron应用自动化测试实例
前端·javascript·功能测试·测试工具·electron·单元测试
bkspiderx1 小时前
C++中的map容器:键值对的有序管理与高效检索
开发语言·c++·stl·map
Hard but lovely1 小时前
Linux: 线程同步-- 基于条件变量 &&生产消费模型
linux·开发语言·c++
H@Z*rTE|i1 小时前
elementUi 当有弹窗的时候提示语被覆盖的问题
前端·javascript·elementui
阿奇__1 小时前
vue2+elementUI table多个字段排序
前端·javascript·elementui
汤姆yu1 小时前
基于python大数据的协同过滤音乐推荐系统
大数据·开发语言·python