关于new操作的疑问
new操作不是返回一个对象?
为什么执行
var bar = function(a) {
this.init(a)
}
bar.prototype.init = function(a) {
console.log("hello");
}
var a = new bar()
会输出//hello
???
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(4)
其实并没有构造函数这一说,只有构造调用,换言之,被new调用的函数才能被看作,构造函数。
但是bar本身也是函数,他也有函数的功能。bar() 就是执行这个函数,所以接着执行this.init(a)由于是new所以this指向了bar,然后找到了bar.prototype.init最后输出结果hello
new 本质上调用的是函数对象内部的[[Construct]]内部方法,[[Construct]]主要做的事情是下面这样的:
令 obj 为新创建的 ECMAScript 原生对象。
设置内部属性和方法,其中最重要的就是把内部属性__proto__设置为构造函数的prototype
以 obj 为 this 值,调用 [[Construct]] 的参数列表为 args,调用 F 的 [[Call]] 内部属性,令 result 为调用结果。(简单说就是已新创建的 obj 为 this 调用构造函数)
如果 Type(result) 是 Object,则返回 result。
返回 obj
对于你上面的例子:
大致可以翻译为下面这样:
所以构造函数内部调用
this.init(a)
,实际上调用的是obj.__proto__.init
也就是bar.prototype.init
,因此会输出 hello。bar 为构造函数,new 的时候会执行 bar()
new 操作符的确返回了一个对象,也就是 a。
this.init(a),这段话使你执行了 a 对象原型中的 init 方法,所以会输出 “hello”。