深入聊一聊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日

相关文章

  • 统信uos系统怎么管理打印界面和打印队列?

    打印界面管理 在统信uos系统中,打印界面管理主要包括设置打印机和打印参数等相关操作。具体步骤如下: 进入系统设置,在“打印管理”中选择“打印机”,添加或编辑打印机,设置打印机名称、型号等基本信息,确认后保存。 打开“打印机”界面,选择要使用的打印机,点击“属性”,设置打印参数,如纸张大小、打印质量、双面打印等,确认后保存。 示例1:在统信uos系统中,用户…

    other 2023年6月27日
    00
  • Mysql模糊查询优化方法及测试详细讲解

    Mysql模糊查询优化方法及测试详细讲解 在进行Mysql模糊查询时,优化查询性能是非常重要的。本攻略将详细讲解Mysql模糊查询的优化方法,并提供两个示例说明。 1. 使用索引 索引是提高查询性能的关键。对于模糊查询,可以使用前缀索引或全文索引来加速查询。 前缀索引 前缀索引是指只对列值的前几个字符进行索引。通过使用前缀索引,可以减少索引的大小,提高查询性…

    other 2023年8月5日
    00
  • 全盘搜索指定文件并拷贝到指定位置[自动重命名]的批处理

    全盘搜索指定文件并拷贝到指定位置[自动重命名]的批处理,可以通过以下几个步骤实现: 第一步: 创建批处理文件 首先需要在电脑上创建一个批处理文件,也就是后缀名为 .bat 的文件,可以使用记事本或其他编辑器来创建这个文件。在批处理文件中编写代码,用于搜索指定的文件并复制到指定位置。建议保存批处理文件时,文件名与代码中的路径一致,避免出现路径错误。 第二步: …

    other 2023年6月26日
    00
  • shell脚本递归遍历目录及子目录的例子分享

    下面给出关于“shell脚本递归遍历目录及子目录的例子分享”的完整攻略。 1. 什么是shell脚本递归遍历 shell脚本递归遍历是指通过编写shell脚本,实现对某一目录及其子目录下所有文件和目录进行遍历。在实际中,通过递归遍历可以快速获得某一个目录下所有文件的信息,这对于批量操作文件或者分析文件内容具有重要意义。 2. shell脚本递归遍历的实现 示…

    other 2023年6月27日
    00
  • js实现多张图片延迟加载效果

    当网页中要加载的图片过多时,如果不进行延迟加载,会导致页面加载缓慢,影响用户体验。本文介绍如何使用 JavaScript 实现多张图片延迟加载效果。 方案一 第一步是在 HTML 中添加图片元素,并设置占位符图片,例如: <img src="placeholder.gif" data-src="image1.jpg&quo…

    other 2023年6月25日
    00
  • React创建组件的三种方式及其区别

    React是一个基于组件和声明式编程的JavaScript库,创建React组件有三种方式。下面我将详细讲解这三种方式及其区别。 1. 函数组件 函数组件是最简单的创建组件的方法,它只需要定义一个返回React元素的函数,通常用于展示非交互式的UI组件。 以下是一个简单的函数组件的示例,它展示了一个简单的欢迎信息: function Welcome(prop…

    other 2023年6月27日
    00
  • BAT文件语法和技巧(bat文件的编写及使用)

    BAT文件语法和技巧 简介 BAT文件是Windows下的可执行脚本文件,全称为“批处理文件”。它可以由Windows的命令提示符解释执行。由于其具有批量和自动化处理的特性,使得BAT文件在Windows上有着广泛的应用。 在BAT文件中,用户可以使用命令和控制结构来编写一系列自动化的操作,从而避免了手动执行冗长的操作。BAT文件的基本语法和技巧可能对初学者…

    other 2023年6月26日
    00
  • 怎样用cmd命令行运行Python文件

    Sure! 如何使用命令行运行Python文件需要以下步骤: 步骤一:打开命令行 打开命令行有多种不同的方法,以下是几种常见的方法: 按下Win+R快捷键,输入cmd,按下回车键 在Windows资源管理器中进入文件夹后,按下shift+右键,在弹出的右键菜单中点击“在此处打开命令窗口” 在Windows 10的开始菜单中搜索“命令提示符”并打开 步骤二:进…

    other 2023年6月26日
    00
合作推广
合作推广
分享本页
返回顶部