广告
返回顶部
首页 > 资讯 > 前端开发 > JavaScript >手写实现JS中的new
  • 638
分享到

手写实现JS中的new

2024-04-02 19:04:59 638人浏览 泡泡鱼
摘要

目录1 new 运算符简介2 new 究竟干了什么事3 模拟实现 new 运算符4 补充⚠ 预备知识: 了解原型和原型链 了解this绑定 1 new

⚠ 预备知识:

  • 了解原型和原型链
  • 了解this绑定

1 new 运算符简介

MDN文档:new 运算符创建一个用户定义的对象类型的实例或具有构造函数的内置对象的实例。


class Person {
    constructor(name) {
        this.name = name;
    }
}
// 创建自定义对象类型的实例
const person = new Person('小明')
// 创建具有构造函数的内置对象的实例
const date = new Date()


new的作用:创建对象的实例

2 new 究竟干了什么事

上面说了new的作用是创建对象的实例,那么它究竟是怎么创建实例的,内部干了哪几件事?

以new Person()为例,当它执行时,会发生以下事情:

创建一个空的简单JS对象


const obj = {}


给这个对象添加属性__proto__,并将该属性链接到构造函数的原型对象


obj.__proto__ = Person.prototype


调用构造函数Person,并将this绑定到新创建的对象obj


Person.apply(obj)


如果构造函数没有显式返回一个对象,则返回新创建的对象,即obj

3 模拟实现 new 运算符

如上所述,new运算符就干了这么4件事,下面我们就根据这4个步骤用函数来模拟实现new面试手写代码)


const _new = function(constructor, ...args) {
    const obj = {}
    obj.__proto__ = constructor.prototype
    const res = constructor.apply(obj, args)
    // 这一步在"补充"中会详细解释
    return res instanceof Object ? res : obj
}

代码非常简单,就是按照上面4步,一步一步写就可以了

4 补充

ES5提供了Object.create方法,该方法可以创建一个对象,并让新对象的__proto__属性指向已经存在的对象。

所以我们可以使用这个方法合并1、2两步


const obj = Object.create(constructor.prototype)
// 等价于
const obj = {}
obj.__proto__ = constructor.prototype

对于第4步,再解释一下

  • 如果构造函数没有显式return(通常情况)那么person就是新创建的对象obj
  • 如果构造函数返回的不是一个对象,比如1、"abc" 那么person还是新创建的对象obj

function Person() {
    ...
   return 1
}

如果构造函数显式返回了一个对象,比如{}function() {}

那么person就不是新创建的对象obj了,而是显式return的这个对象


function Person() {
  // 函数也是对象
  return function() {}
}

所以我们在_new函数最后一句代码是:


return res instanceof Object ? res : obj


注意:模拟实现的函数_new传入的参数只能是构造函数,不能是类


class Animal {  ...}_new(Animal)// 会报错:Class constructor Animal cannot be invoked without 'new'// 类只能通过new来创建

到此这篇关于手写实现js中的new的文章就介绍到这了,更多相关JS中的new内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: 手写实现JS中的new

本文链接: https://www.lsjlt.com/news/156533.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 手写实现JS中的new
    目录1 new 运算符简介2 new 究竟干了什么事3 模拟实现 new 运算符4 补充⚠ 预备知识: 了解原型和原型链 了解this绑定 1 new...
    99+
    2022-11-12
  • 怎么实现JS中的new
    这篇文章主要介绍“怎么实现JS中的new”,在日常操作中,相信很多人在怎么实现JS中的new问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”怎么实现JS中的new”的疑惑有所帮助!接下来,请跟着小编一起来学习吧...
    99+
    2023-06-25
  • JS new操作原理及手写函数模拟实现示例
    目录引言原理手写函数模拟 newv1 基本实现v2 考虑参数类型v3 Object.prototype.__proto__ 的替代方案v4 使用 ES6 语法实现v5 考虑 ES6 ...
    99+
    2022-11-13
  • JS手写bind之处理new的情况详解
    目录new判断函数是否通过 new 被调用new 和 bind实现完整的 bind结尾大家好,我是前端西瓜哥。 之前写了一篇关于 JS 中 bind 方法的实现的文章,并给出了实现:...
    99+
    2022-11-13
  • JS中callapplybind函数手写实现demo
    目录正文call 方法apply 方法bind 方法总结正文 JavaScript 中的函数是一等公民,可以像普通变量一样被传递和使用。这种灵活性使得函数可以被用于各种场景,比如对...
    99+
    2023-03-15
    JS call apply bind函数 JS 手写函数
  • 深入聊一聊JS中new的原理与实现
    目录定义构造函数体不同 无返回值 返回对象 返回非对象 没有属性绑定+返回非对象 构造函数类型不同 构造函数为普通函数 构造函数为箭头函数 手写new 总结定义 new 运算符创建一...
    99+
    2022-11-12
  • JS 中 new 的作用详细
    目录1、举例2、制造一百个士兵3、质疑4、改进5、优雅?6、JS 之父的关怀7、这一次我们用 new 来写8、注意 constructor 属性简介: 大部分讲 new 的文章会从...
    99+
    2022-11-12
  • 浅谈js中Object.create()与new的具体实现与区别
    目录Object.create与new区别Object.create()原理new原理继承比较组合继承与寄生组合继承组合继承寄生组合继承Object.create与new区别 fun...
    99+
    2022-11-13
  • 如何实现JS中‘hello’与new String(‘hello’)引出的问题
    小编给大家分享一下如何实现JS中‘hello’与new String(‘hello’)引出的问题,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起...
    99+
    2022-10-19
  • JS中call、apply和bind函数手写实现demo的方法是什么
    本篇内容介绍了“JS中call、apply和bind函数手写实现demo的方法是什么”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!JavaS...
    99+
    2023-07-05
  • js中new set()使用的方法是什么
    在JavaScript中,可以使用以下方法来使用`new Set()`:1. 创建一个空的Set对象:```javascriptco...
    99+
    2023-09-29
    js
  • JS前端面试手写apply和bind实例
    目录前言apply && bindapply && bind 作用相同点 VS 不同点轻松手写手写实现 apply手写实现 bind总结前言 面试官...
    99+
    2022-12-08
    JS面试手写apply bind JS前端面试
  • 怎么在JavaScript中实现new
    这期内容当中小编将会给大家带来有关怎么在JavaScript中实现new,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。创建一个空对象,将它的引用赋给 this,继承函数的原型;通过 this 将属性和方法...
    99+
    2023-06-15
  • operator new在C++中的各种写法总结
    乍一看,在C++中动态分配内存很简单:new是分配,delete是释放,就这么简单。然而,这篇文章讲得要复杂一点,并且要考虑到自定义层次。这也许对简单的程序并不重要,但对你在代码中控...
    99+
    2022-11-15
    operator_new
  • Python手写回归树的实现
    目录回归树创建子节点预测计算误差概括的步骤更深入的模型在本篇文章中,我们将介绍回归树及其基本数学原理,并从头开始使用Python实现一个完整的回归树模型。 为了简单起见这里将使用递归...
    99+
    2022-11-11
  • Android实现手写签名
    本文实例为大家分享了Android手写签名的实现方法,产品要求用户可以在app上签协议。。所以得弄个手写签名版,参考了一些资料自己写了个PaintView去继承View,实现签...
    99+
    2022-06-06
    Android
  • 面试手写实现Promise.all
    目录前言常见面试手写系列Promise.resolve简要回顾源码实现Promise.reject简要回顾源码实现Promise.all简要回顾源码实现Promise.allSett...
    99+
    2022-11-13
  • JS中new Date().Format("yyyy-MM-dd") 报错的解决
    目录JS日期格式化转换方法1. 将日期转换为指定的格式2. 将指定的日期转换为"年月日"的格式3. 将 "时间戳" 转换为...
    99+
    2023-01-28
    JS new Date().Format new Date().Format("yyyy-MM-dd") new Date().Format("yyyy-MM-dd&qu
  • jquery中如何实现无new构建
    这篇文章主要为大家展示了“jquery中如何实现无new构建”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“jquery中如何实现无new构建”这篇文章吧。前言当...
    99+
    2022-10-19
  • ES6中如何实现new Function()语法
    这篇文章给大家分享的是有关ES6中如何实现new Function()语法的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。具体如下:学习《ECMAScript6入门》中的模板字符串...
    99+
    2022-10-19
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作