如何自己实现 JavaScript 的 new 操作符?
2020/3/25 14:31:34
本文主要是介绍如何自己实现 JavaScript 的 new 操作符?,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
前言
new
大家肯定都不陌生,单身没有对象的时候就 new
一个,很方便。那么它在创建实例的时候,具体做了哪些操作呢?今天我们就来一起分析一下。
构造函数
在介绍 new
之前,必须要知道什么是构造函数。
构造函数和普通函数在写法上没有任何区别,当一个函数通过 new Fun()
调用时,就叫做构造函数,构造函数首字母通常大写。
function User(name) { this.name = name; } let u = new User('leo');
这里,User
就是构造函数,当然你也可以直接调用 User()
,但是这样就起不到创建实例的作用,在非严格模式下,会把 name
属性挂在 window
上。
new 操作符
那么 new
操作符到底做了什么事情呢,可以创建出一个实例?
new
运算符创建一个用户定义的对象类型的实例或具有构造函数的内置对象的实例。new
关键字会进行如下的操作:
- 创建一个空的简单JavaScript对象(即
**{}**
);- 链接该对象(即设置该对象的构造函数)到另一个对象 ;
- 将步骤1新创建的对象作为
**this**
的上下文 ;- 如果该函数没有返回对象,则返回
**this**
。
以上引用自 new 操作符 - MDN
可能第 2、4 步大家看的不是很明白,这里我重新总结一下这 4 个步骤:
- 创建一个空对象
u = {}
- 绑定原型,
u.__proto__ = User.prototype
- 调用
User()
函数,并把空对象u
当做this
传入,即User.call(u)
- 如果
User()
函数执行完自己return
一个object
类型,那么返回此变量,否则返回this
,注意:如果构造函数返回基本类型值,则不影响,还是返回this
自己实现一个 new
知道了 new
操作符的原理,下面我们自己来实现一个 FakeNew
函数。
function FakeNew() { let obj = {}; // 将类数组 arguments 转为数组,同时将第一个参数也就是构造函数 shift 出来 let Constructor = [].shift.apply(arguments); // 绑定原型 obj.__proto__ = Constructor.prototype; // 调用构造函数,将 obj 当做 this 传入 let res = Constructor.apply(obj, arguments); // 返回 return typeof res === 'object' ? res : obj; } function User(name) { this.name = name; } User.prototype.getName = function() { return this.name; } let u = FakeNew(User, 'leo'); console.log(u); console.log(u.getName());
相应关键步骤的注释已经附在代码里面了,这样我们就实现了一个 new
操作,相信大家以后再看到 new
,会有一种通透的感觉了。
这篇关于如何自己实现 JavaScript 的 new 操作符?的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-11-24Vite多环境配置学习:新手入门教程
- 2024-11-23实现OSS直传,前端怎么实现?-icode9专业技术文章分享
- 2024-11-22在 HTML 中怎么实现当鼠标光标悬停在按钮上时显示提示文案?-icode9专业技术文章分享
- 2024-11-22html 自带属性有哪些?-icode9专业技术文章分享
- 2024-11-21Sass教程:新手入门及初级技巧
- 2024-11-21Sass学习:初学者必备的简单教程
- 2024-11-21Elmentplus入门:新手必看指南
- 2024-11-21Sass入门:初学者的简单教程
- 2024-11-21前端页面设计教程:新手入门指南
- 2024-11-21Elmentplus教程:初学者必备指南