关于new操作的疑问

发布于 2022-09-03 19:25:25 字数 206 浏览 17 评论 0

new操作不是返回一个对象?
为什么执行

var bar = function(a) {
    this.init(a)
}
bar.prototype.init = function(a) {
    console.log("hello");
}

var a = new bar()

会输出//hello
???

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

乜一 2022-09-10 19:25:25
var bar = function(a) {
    console.log("hello")
}
var a = new bar()
//hello

其实并没有构造函数这一说,只有构造调用,换言之,被new调用的函数才能被看作,构造函数。
但是bar本身也是函数,他也有函数的功能。bar() 就是执行这个函数,所以接着执行this.init(a)由于是new所以this指向了bar,然后找到了bar.prototype.init最后输出结果hello

丑丑阿 2022-09-10 19:25:25

new 本质上调用的是函数对象内部的[[Construct]]内部方法,[[Construct]]主要做的事情是下面这样的:

  1. 令 obj 为新创建的 ECMAScript 原生对象。

  2. 设置内部属性和方法,其中最重要的就是把内部属性__proto__设置为构造函数的prototype

  3. 以 obj 为 this 值,调用 [[Construct]] 的参数列表为 args,调用 F 的 [[Call]] 内部属性,令 result 为调用结果。(简单说就是已新创建的 obj 为 this 调用构造函数)

  4. 如果 Type(result) 是 Object,则返回 result。

  5. 返回 obj

对于你上面的例子:

var a = new bar()

大致可以翻译为下面这样:

var obj = {};
obj.__proto__ = bar.prototype;
bar.call(obj, args);

所以构造函数内部调用 this.init(a),实际上调用的是 obj.__proto__.init 也就是 bar.prototype.init,因此会输出 hello。

涫野音 2022-09-10 19:25:25

bar 为构造函数,new 的时候会执行 bar()

权谋诡计 2022-09-10 19:25:25

new 操作符的确返回了一个对象,也就是 a。

this.init(a),这段话使你执行了 a 对象原型中的 init 方法,所以会输出 “hello”。

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文