扫码关注官方订阅号
The constructor function Foo is called,这句constructor function具体是怎么调用的?或者调用这个函数的对象是什么?
人生最曼妙的风景,竟是内心的淡定与从容!
在不考虑Foo有返回值的情况下,new Foo(...)相当于:
new Foo(...)
JS引擎帮你生成一个对象,不妨记作a,这个a对象是以Foo.prototype为原型的。
Foo.prototype
执行Foo.call(a, ....)。
Foo.call(a, ....)
返回a。
问题一:“Foo是怎样调用的?”答案:就是按照第2.步那样调用的。
问题二:“调用Foo的是哪个对象?”。答案:可以认为就是a,也就是返回的新对象。当然,仅仅是这样认为。
扩展:new Foo(...)执行过程在Java中跟JavaScript中基本是一样的,所以你可以参考Java。
new是一个运算符,具体谁调用了构造器应该是javascript内部做的,看起来像是那个空对象。
function Foo(name) { this.name = name; } var foo = new Foo("moment"); var notfoo = Foo("globalname");
Foo 函数只有在 var foo = new Foo("moment") 这种调用下,才能叫构造函数。此时会创建一个新的对象,Foo 函数中的 this 会指向这个新的对象,如果 Foo 函数没有返回值(例子中就是这种情况),那通过构造形式调用的这个函数,就会返回刚刚新建的那个对象。
Foo
var foo = new Foo("moment")
this
但是,如果你不通过 new 来调用,如:var notfoo = Foo("globalname") ,这就是个普通函数调用,并且没有返回值,所以 notfoo 其实是 undefined,并且此时 this 会绑定到全局对象上,此时全局对象会多一个属性 name,并且 name 的值为 "globalname" 。
new
var notfoo = Foo("globalname")
notfoo
undefined
name
"globalname"
我的理解是,如果通过new运算符调用函数,函数的作用就是构造函数,调用结束会返回一个对象,这个对象的上级就是全局对象,因此可以理解为就是全局对象调用了构造函数,产生了新的下级对象。如果不使用new算符,就只是在全局对象上调用函数,这时函数中的属性的方法添加给全局对象。
微信扫码关注PHP中文网服务号
QQ扫码加入技术交流群
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号
PHP学习
技术支持
返回顶部
在不考虑Foo有返回值的情况下,
new Foo(...)相当于:JS引擎帮你生成一个对象,不妨记作a,这个a对象是以
Foo.prototype为原型的。执行
Foo.call(a, ....)。返回a。
问题一:“Foo是怎样调用的?”
答案:就是按照第2.步那样调用的。
问题二:“调用Foo的是哪个对象?”。
答案:可以认为就是a,也就是返回的新对象。当然,仅仅是这样认为。
扩展:new Foo(...)执行过程在Java中跟JavaScript中基本是一样的,所以你可以参考Java。
new是一个运算符,具体谁调用了构造器应该是javascript内部做的,看起来像是那个空对象。
Foo函数只有在var foo = new Foo("moment")这种调用下,才能叫构造函数。此时会创建一个新的对象,Foo函数中的this会指向这个新的对象,如果Foo函数没有返回值(例子中就是这种情况),那通过构造形式调用的这个函数,就会返回刚刚新建的那个对象。但是,如果你不通过
new来调用,如:var notfoo = Foo("globalname"),这就是个普通函数调用,并且没有返回值,所以notfoo其实是undefined,并且此时this会绑定到全局对象上,此时全局对象会多一个属性name,并且name的值为"globalname"。我的理解是,如果通过new运算符调用函数,函数的作用就是构造函数,调用结束会返回一个对象,这个对象的上级就是全局对象,因此可以理解为就是全局对象调用了构造函数,产生了新的下级对象。如果不使用new算符,就只是在全局对象上调用函数,这时函数中的属性的方法添加给全局对象。