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())

打印看下,看到完美输出

相关推荐
码小猿的CPP工坊5 小时前
C++跨平台开发之基于wxWidgets开发GUI程序简介-002
开发语言·c++
波力海苔夹心脆6755 小时前
C# 固高 GTS 运动控制卡入门:伺服上下电、Jog 点动与二维插补(WinForms 实战)
服务器·开发语言·c#·运动控制·伺服电机·winforms·固高
海绵宝宝转agent5 小时前
LeetCode100个人题解+java面经总结
java·开发语言·笔记·学习·算法
chenbingjie_c5 小时前
C++ 继承全解析(从三种继承方式到菱形继承与内存布局)
开发语言·c++
唔665 小时前
在透镜圆正中加了一个描边空心字
前端·javascript
定栓5 小时前
Vite-legacy产物console删除机制
前端·javascript·vue.js
程序员大阳13 小时前
副队长JavaScript教程(49)-主动抛出异常与错误类型
javascript·异常处理·error·throw·错误类型
hhhjhl13 小时前
Protobuf.js 跨端三方库仓颉适配全流程
javascript·网络·udp
学逆向的14 小时前
C 堆区内存管理
c语言·开发语言·网络安全
huoyueyi14 小时前
《融天AI-APP从0到1开发实录》
开发语言·lua