javascript - 关于new操作的疑问
PHP中文网
PHP中文网 2017-04-11 13:00:12
[JavaScript讨论组]

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

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

var a = new bar()

会输出//hello
???

PHP中文网
PHP中文网

认证高级PHP讲师

全部回复(4)
阿神
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

伊谢尔伦

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。

高洛峰

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

伊谢尔伦

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

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

热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号