前端面试手写代码——模拟实现new运算符
2021-10-21 12:55
274 查看
[toc]
⚠ 预备知识:
- 了解原型和原型链
- 了解
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
传入的参数只能是构造函数,不能是类class Animal { ...}_new(Animal)// 会报错:Class constructor Animal cannot be invoked without 'new'// 类只能通过new来创建实例
所以我们在
_new函数最后一句代码是:
return res instanceof Object ? res : obj
公众号【前端嘛】获取更多优质内容
相关文章推荐
- 「中高级前端面试」JavaScript手写代码无敌秘籍
- 【前端面试】手写代码 css js
- JS模拟的new运算符工作原理(new运算符的伪码实现)
- 2019前端面试系列——JS高频手写代码题
- 【JS】528- 前端常见手写代码实现
- 「中高级前端面试」JavaScript手写代码无敌秘籍(推荐)
- 2019前端面试系列——JS高频手写代码题
- 经典面试编程题--atoi()函数的实现(就是模拟手算,核心代码就一句total = 10 * total + (c - '0'); 但是要注意正负号、溢出等问题)
- 面试总结之[单例模式代码实现]
- js模拟权限选择实现代码(select操作)
- 模拟系统nbtstat 的代码实现
- iOS开发—纯代码手写(不依靠第三方)实现顶部可滑动标题栏切换控制器
- python 模拟斗地主发牌(简易代码实现)
- Angularjs 手写日历的实现代码(不用插件)
- Ajax手写代码实现-用户验证
- Java运用JSON实现后台与前端分工合作(代码实例)
- Python代码实现简单的MNIST手写数字识别(适合初学者看)
- javascript模拟滚动条实现代码
- iOS 开发中 代码实现 模拟内存警告
- Swing界面布局之代码手写二, 山寨Netbean layout实现