JS中的new

JavaScript022

JS中的new,第1张

现在写一个函数,这个函数的返回值是一个对象,来观察一下这个对象,和函数体内this指向

①,对象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())()