JavaScript 之 new 的原理
疑问
现在有以下 JavaScript 代码:
function Foo(name) {
this.name = name
}
Foo.prototype.getName = function() {
console.log(this.name)
}
const foo = new Foo('张三')
console.log(foo.name) // 张三
在这段代码里,当执行 const foo = new Foo('张三')
的时候,new 做了什么事情?
解答
在 JS 里, new
的作用是 创建对应构造函数对象的一个实例
,这个实例可以访问构造函数原型上的属性和方法。那它是怎么实现这个功能的呢?具体来说,做了以下几件事:
- 创建一个空对象,假设是 obj
- 获取构造函数,将 1 中对象的原型链接到构造函数的 prototype
- 执行构造函数,假设结果是 ret
- 判断 ret 是否是对象?如果是,返回 ret ;如果不是,返回第一步创建的 obj
代码实现
function mockNew() {
const obj = {} // 创建空对象
const constructor = [].shift.call(arguments) // 获取传入的构造函数
obj.__proto__ = constructor.prototype // 设置原型
const ret = constructor.apply(obj, arguments) // 执行构造函数
return typeof ret === 'object' ? ret : obj // 判断返回结果
}
测试
function Foo(name) {
this.name = name
}
Foo.prototype.getName = function() {
console.log(this.name)
}
const foo = mockNew(Foo, '张三')
console.log(foo.name) // 张三
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

上一篇: 浏览器安全之 XSS
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论