【手撕系列】new

简介: new

9616c9d877dde168531ba1f6e78d0ef.png

前言

new 运算符是 javascript 中常用的一个方法,经常用来创建我们自定义对象或者内置对象实例,今天就和大家一起了解和动手写一个自己的 new 方法 (create)

Javascript 中的 new

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

手撕代码前还是先来了解下 new 究竟是个什么东西,看了上面的定义,可能有的同学还是有点蒙,简单总结下 new 就是用来 创造实例对象的一个方法

本质上它也是一个方法,接收了两个参数 constructor(指定对象实例的类型的类或函数)arguments(调用的参数列表) ,怎么样,用过 es6 的 class 方法的同学是不是觉得很熟悉,我们来对比下

new constructor[([arguments])]  // 注:文档中要是看到中括号表示可选项
class Name {
    constructor([arguments]) {}
}
new Name()
复制代码

实际上 new 一个 class 的作用和 new 一个 function 是一样的,都是通过一个构造函数 constructor 来创建一个实例对象,它可以看作一个语法糖,让对象原型的写法更加清晰、更像面向对象编程的语法

new 操作符做了什么?

要想手写一个 new ,那就要知道 new 都做了哪些操作

  • 创建了一个空对象({}
  • 为创建的空对象添加属性 __ptoto__ ,并指向于构造函数的原型
  • 将创建的对象作为构造函数的上下文 (改变this指向)
  • 如果该函数没有返回对象,则返回 this

注意这里是没有返回对象,如果返回的是一个基础数据类型,则忽略

如何手写一个 new 方法?

我们先用 new 方法通过构造函数实例化一个对象,看看究竟发生了什么,然后在自己定义一个 create 方法,最后看结果一不一致

编写构造函数

function Friend(name) {
    this.name = name
}
复制代码

通过 new 来实例化对象

const friend = new Friend('小明')
console.log(friend)
复制代码

当代码 new Friend(...) 执行时,会发生

  • 一个继承自 Friend.prototype 的对象被创建
  • this 绑定到创建的对象
  • 返回该对象

create 的实现

function create (fn, ...args) {
    // 1. 创建一个空对象
    var obj = {}
    // 2. 将空对象的原型指向构造函数的原型
    Object.setPrototypeOf(obj, fn.prototype)
    // 3. 将空对象作为构造函数的上下文
    var result = fn.apply(obj, args)
    // 4. 对构造函数的返回值做判断处理
    return result instanceof Object ? result : obj
}
复制代码

最后我们来试一下

const friend1 = create(Friend, '小明')
console.log(friend)  // Friend {name: '小明'}
console.log(friend1) // Friend {name: '小明'}
console.log(friend1.__proto__ == friend.__proto__) // true
复制代码

好啦~大功告成 ^-^

相关文章
|
6月前
|
机器学习/深度学习 人工智能 数据处理
AI计算机视觉笔记一:YOLOV5疲劳驾驶行为检测
如何使用云服务器AutoDL进行深度学习模型的训练,特别是针对YOLOV5疲劳驾驶行为训练检测
|
9月前
|
数据采集 Web App开发 API
Python中User-Agent的重要作用及实际应用
Python中User-Agent的重要作用及实际应用
|
8月前
|
Java 测试技术 Maven
Maven 构建生命周期
Maven的构建生命周期包括Clean(clean)、Default(validate, compile, test, package, verify, install, deploy)和Site(site, deploy-site)三个阶段。Default生命周期用于验证、编译、测试、打包、检查、安装和部署项目。插件目标如dependency:copy-dependencies可在阶段间操作。例如,`mvn clean dependency:copy-dependencies package`先清理、复制依赖,再打包。
|
9月前
|
JavaScript 前端开发 Java
正则表达式深度解析:匹配制表符
【4月更文挑战第2天】
650 2
正则表达式深度解析:匹配制表符
|
SQL 关系型数据库 MySQL
MySQL锁应用详解(上)
MySQL锁应用详解
240 0
|
运维 前端开发
基于React、Mobx、Webpack 和 React-Router的项目模板。 #88
基于React、Mobx、Webpack 和 React-Router的项目模板。 #88
136 0
|
iOS开发
iOS开发 - 打开文件后进行文件分享(QLPreviewController)
iOS开发 - 打开文件后进行文件分享(QLPreviewController)
258 0
|
存储 Cloud Native NoSQL
赛题解析 | 第四届全球数据库大赛——赛道1: 云原生共享内存数据库性能优化
第四届全球数据库大赛—PolarDB性能挑战赛,瓜分40万奖金池,只等你来!各赛道TOP10都可获得现金奖励
698 0
赛题解析 | 第四届全球数据库大赛——赛道1: 云原生共享内存数据库性能优化
|
SQL 关系型数据库 数据库
PostgreSQL 选择数据库
PostgreSQL 选择数据库
242 0
|
新零售 达摩院 Cloud Native
云原生时代的“精益实践”:企业效能提升10倍“杀手锏”
1月15日,国内知名“精益产品开发”研究和实践者、阿里云云效资深技术专家何勉在阿里云《云计算情报局》线上直播栏目中,分享其对研发新模式的最新思考,提出“下一代精益开发方法”,助力企业在研发效能上提升10倍。 同时,他认为,云原生是效能提升的巨大契机,赋予了精益实践天然的优势,是精益实践的最佳助力。
1949 0
云原生时代的“精益实践”:企业效能提升10倍“杀手锏”

热门文章

最新文章