①,对象a就是一个空对象
②,对象a没有color属性
③,对象a原型指向Object.prototype
④,函数体内this指向window(上图可见,没调用函数之前,window.color属性不存在)
在执行函数时,加一个new试试看有啥效果:
①,没有return,这个函数居然返回了一个对象
②,对象a有个color属性
③,对象a的原型指向了这个构造函数的prototype属性
④,window对象没有color属性
⑤,this指向了对象a
由上得出总结new的作用:
①,new能让一个构造函数返回一个对象(下面称为A)而无需return
②,new会让函数体内的this指向这个A
③,new会让A的原型指向这个构造函数的prototype属性
PS:
①,new只用了三个字符,却实现了很多功能,非常贴心,可以称呼new为语法糖或贴心语法( syntactic sugar )
②,一个函数自带prototype对象,而且里面默认有一个constructor属性,这个属性返回实例对象的构造函数,如果你重新给prototype对象赋值,小心不要覆盖掉它
③,如果使用new,函数内就别 return一个对象 了 ,这样返回的是return后面的对象,this不会指向它
④,就算函数体内空空如也,new的作用不变
这个问题问到js的精髓了。在js中,万物皆对象,函数只是对象的一种。
js的this,指代着当前对象的自身(itself),但通过你的问题的内容,发现,你关注的地方并不单单在this关键词。
function a(value){
this.value =value
alert(this.vlaue)
}
上面的这个函数语句,意味着,创建了名字为a,参数为value的函数对象:
这个函数对象有一个来自于参数的动态属性value;
这个函数对象还有一个返回值为void的window内置函数alert;
这个函数对象自身没有返回值(void)。
alert(new a(1).value)
上面的这个语句,意味着,新建一个参数为1的a对象,并把这个对象的value作为参数赋值给window的alert函数,并执行window的alert函数。
在上面的语句中,测试时,会出现两次警告框,且警告框的内容都是1,这是因为在新建a对象的时候,执行了一次alert,拿到a对象的value后,又执行了一次alert。
alert(window.a(3))
上面的这个语句,意味着,把3作为window对象的a函数的一个参数,执行a函数。
在上面的语句中,测试时,也会出现两次警告框,但是第一次是3,第二次就是undefined了,这是因为,window.a(3)执行的时候,会alert一下,内容就是3,alert(...)执行的时候,因为里面的window.a(3)没有返回值,所以alert的参数就是没有,所以就导致弹出了一个“undefined”
function a(){
fucntion b(){}
return b
}
new a()()
可以这么写(new a()())的原因是:
1、“new a()” ,这个是个对象创建过程,就是说,这样可以创建一个全新的函数对象。
2、第二个“()”,这个是个函数执行过程,就是说,加上一对“()”后,这个对象函数才开始执行。
a().b()
不可以这么写的原因是:
a()会让这个a函数对象执行后,返回的是一个名字为没有名字的空函数对象,这个空函数对象里面,并没有一个名字叫b的方法。
你如果想让上面的a里面的b函数顺利执行,可以参考下面的案例:
function a(){
function b(){alert(111)}
return b
}
a()()//这样你就顺利的看到这个b函数执行了。
最后给你一个让你头晕的案例,呵呵。考虑一下是如何执行的,这个案例你完全搞明白后,基本上js的函数对象返回值问题,就不会再有了。
function a(){
this.b = function (){
return this.c = function(){
alert(111)
}
}
}
(new a().b())()