深入聊一聊JS中new的原理与实现

深入聊一聊JS中new的原理与实现

1. 前言

在 JavaScript 中,new 关键字是用来创建对象的最常用方式之一。但是,我们在使用 new 关键字的时候,很少会考虑到它是如何工作的。本文将试图解释 new 关键字的工作原理,以及如何手动实现 new 的功能。

2. new的原理

在执行 new 操作符时,它做了以下几件事情:

  1. 创建一个新对象。
  2. 将新对象的原型链接到构造函数的原型对象上。
  3. 将构造函数的 this 指向新对象并调用该构造函数。
  4. 如果构造函数没有返回对象,则返回该新对象。

具体来说,可以使用函数表达式来模拟 new 操作符的行为。下面是一个示例代码:

function myNew(Con, ...args) {
  // 创建一个新对象
  let obj = {}
  // 将新对象的原型链接到构造函数的原型对象上
  obj.__proto__ = Con.prototype
  // 将构造函数的 this 指向新对象并调用该构造函数
  let result = Con.call(obj, ...args)
  // 如果构造函数没有返回对象,则返回该新对象
  if (result && (typeof result === 'object' || typeof result === 'function')) {
    return result
  }
  return obj
}

这里使用了 rest operator 来处理构造函数的参数,并将它们传递给构造函数。最后使用了 call 方法来调用构造函数,并且使用条件语句来判断构造函数是否返回了一个对象。如果构造函数返回了一个对象,则返回该对象,否则返回新创建的对象。

3. 示例说明

3.1 创建一个对象

下面是一个使用 new 操作符创建对象的示例代码:

function Person(name, age) {
  this.name = name
  this.age = age
}

let person = new Person('Bob', 30)

console.log(person) // Person { name: 'Bob', age: 30 }

使用 new 操作符创建了一个 Person 对象,该对象具有 name 和 age 属性。

接下来,我们可以使用手动实现的 myNew 函数来创建同样的对象:

let person = myNew(Person, 'Bob', 30)

console.log(person) // { name: 'Bob', age: 30 }

这里使用 myNew 函数来创建一个 Person 对象,该对象具有 name 和 age 属性。

3.2 创建一个继承自其它对象的对象

下面是一个使用 new 操作符创建继承自其它对象的对象的示例代码:

function Parent() {
  this.name = 'parent'
}

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

function Child() {
  Parent.call(this)
  this.type = 'child'
}

Child.prototype = Object.create(Parent.prototype)
Child.prototype.constructor = Child

let child = new Child()

console.log(child.getName()) // parent

使用 new 操作符创建了一个继承自 Parent 的 Child 对象,该对象具有 name 和 type 属性。并且调用了 Child 对象的 getName 方法,返回了 parent。

接下来,我们可以使用手动实现的 myNew 函数来创建同样的对象:

function Parent() {
  this.name = 'parent'
}

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

function Child() {
  Parent.call(this)
  this.type = 'child'
}

Child.prototype = Object.create(Parent.prototype)
Child.prototype.constructor = Child

let child = myNew(Child)

console.log(child.getName()) // parent

这里使用 myNew 函数来创建一个继承自 Parent 的 Child 对象,该对象具有 name 和 type 属性。并且调用了 Child 对象的 getName 方法,返回了 parent。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:深入聊一聊JS中new的原理与实现 - Python技术站

(0)
上一篇 2023年6月26日
下一篇 2023年6月26日

相关文章

  • 一篇文章带你搞定JAVA内存泄漏

    一篇文章带你搞定JAVA内存泄漏 什么是内存泄漏? 内存泄漏是指在程序中分配的内存空间没有被正确释放,导致这些内存空间无法再被程序使用,从而造成内存的浪费。在Java中,内存泄漏是指对象在不再被使用时仍然占用内存空间,无法被垃圾回收器回收。 如何检测内存泄漏? Java提供了一些工具和技术来检测内存泄漏,其中最常用的是使用内存分析工具,如Eclipse Me…

    other 2023年8月2日
    00
  • redis客户端连接错误 NOAUTH Authentication required

    当我们连接 Redis 客户端时,有时会遇到一个错误信息:NOAUTH Authentication required,这意味着我们的 Redis 实例已启用了认证机制,并且连接到 Redis 实例需要提供密码。以下是详细的攻略: 1. 连接 Redis 实例 使用 Redis 客户端连接 Redis 实例时,需要通过 redis-cli 命令来连接,并指定…

    other 2023年6月25日
    00
  • 如何显示文件后缀名 win7系统后缀名显示方法

    如何显示文件后缀名 – Win7系统后缀名显示方法 在Windows 7系统中,默认情况下,文件的后缀名是隐藏的。然而,有时候我们需要显示文件的后缀名,以便更好地管理和识别文件类型。下面是在Win7系统中显示文件后缀名的方法: 方法一:通过文件夹选项显示后缀名 打开任意一个文件夹,然后点击窗口顶部的“组织”按钮。 在下拉菜单中选择“文件和文件夹选项”。 在弹…

    other 2023年8月5日
    00
  • 电脑自动重启怎么办 电脑频繁重启的解决方法

    电脑自动重启怎么办:电脑频繁重启的解决方法 电脑频繁自动重启是一种比较常见的问题,会给我们的工作和学习带来影响。然而,它通常并不是一个严重的问题,并且大多数情况下都可以通过以下方法轻松解决。 前期准备 在开始解决电脑自动重启的问题之前,您需要进行以下准备: 备份重要文件,以防意外数据丢失。 关闭自动重启:打开“控制面板” -> “系统和安全” -&gt…

    other 2023年6月26日
    00
  • jquery ajax修改全局变量示例代码

    jQuery Ajax 修改全局变量示例代码攻略 在这个攻略中,我们将使用jQuery Ajax来修改全局变量的示例代码。jQuery Ajax是一个强大的工具,可以通过异步请求从服务器获取数据,并在页面上进行操作。我们将使用它来修改全局变量的值。 步骤1:创建全局变量 首先,我们需要创建一个全局变量,以便在整个页面中访问和修改它。在JavaScript中,…

    other 2023年7月29日
    00
  • securecrt字体变色多彩

    以下是SecureCRT字体变色多彩的完整攻略,包括两个示例说明。 1. SecureCRT字体变色多彩的方法 SecureCRT是一款常用的终端仿真软件,可以通过修改字体颜色来实现多彩的效果。具体方法如下: 打开SecureCRT软件,进入“Options”菜单,选择“Session Options”。 在“Session Options”窗口中,选择“A…

    other 2023年5月9日
    00
  • mybatis 集合嵌套查询和集合嵌套结果的区别说明

    MyBatis集合嵌套查询和集合嵌套结果的区别说明 在MyBatis中,集合嵌套查询和集合嵌套结果是两种不同的技术,用于处理数据库中的关联数据。下面将详细介绍它们的区别,并提供两个示例说明。 集合嵌套查询 集合嵌套查询是指在查询过程中,通过嵌套的方式查询关联数据。这种方式适用于一对多或多对多的关联关系。在MyBatis中,可以使用collection元素来实…

    other 2023年7月27日
    00
  • microsoftvisualstudio2010产品密钥

    Microsoft Visual Studio 2010产品密钥 Microsoft Visual Studio 2010是微软开发的一款IDE(集成开发环境),包括了针对Windows、Web、Office、Sharepoint、Silverlight等各种平台的开发工具。在使用这个软件的时候,需要输入有效的产品密钥来激活该软件。如果你正在寻找Micros…

    其他 2023年3月28日
    00
合作推广
合作推广
分享本页
返回顶部