JavaScript 之 new 的原理

发布于 2023-11-01 07:32:52 字数 1108 浏览 28 评论 0

疑问

现在有以下 JavaScript 代码:

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

const foo = new Foo('张三')
console.log(foo.name)  // 张三

在这段代码里,当执行 const foo = new Foo('张三') 的时候,new 做了什么事情?

解答

在 JS 里, new 的作用是 创建对应构造函数对象的一个实例 ,这个实例可以访问构造函数原型上的属性和方法。那它是怎么实现这个功能的呢?具体来说,做了以下几件事:

  1. 创建一个空对象,假设是 obj
  2. 获取构造函数,将 1 中对象的原型链接到构造函数的 prototype
  3. 执行构造函数,假设结果是 ret
  4. 判断 ret 是否是对象?如果是,返回 ret ;如果不是,返回第一步创建的 obj

代码实现

function mockNew() {
  const obj = {}   // 创建空对象
  const constructor = [].shift.call(arguments)  // 获取传入的构造函数
  obj.__proto__ = constructor.prototype   // 设置原型
  const ret = constructor.apply(obj, arguments)  // 执行构造函数
  return typeof ret === 'object' ? ret : obj   // 判断返回结果
}

测试

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

const foo = mockNew(Foo, '张三')
console.log(foo.name)  // 张三

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据

关于作者

灼痛

暂无简介

文章
评论
27 人气
更多

推荐作者

櫻之舞

文章 0 评论 0

弥枳

文章 0 评论 0

m2429

文章 0 评论 0

野却迷人

文章 0 评论 0

我怀念的。

文章 0 评论 0

    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文