functionFoo(){getName=function(){alert(1);}console.log(this)returnthis;}Foo.getName=function(){alert(2);}Foo.prototype.getName=function(){alert(3);}vargetName=function(){alert(4);}functiongetName(){alert(5);}Foo.getName();//2这里是不是因为构造函数Foo中的getName方法没有this关键字,所以就不是1,而是直接采用外部的方法,意思就是Foo对象调用getName的时候弹出2??getName();//4Foo().getName();//1这里为什么是1呢?是因为Foo返回了this对象,这里的this对象是window,所以这句话的意思不是应该等同window.getName()??那应该是4啊为什么是1getName();//1这里变成1是不是因为3的那一步Foo返回了this对象,所以改变了全局函数getName??所以返回1newFoo.getName();//2newFoo().getName();//3newnewFoo().getName();//35-7不是很理解,解释不出原因。5是不是new关键字其实没起什么作用呢?都只是调用一个方法而已?
2 回答
一只萌萌小番薯
TA贡献1795条经验 获得超7个赞
Foo.getName();//2直接调用Foo自己的方法,而不是Foo对象的方法。Foo自己的方法是alert(2)那个,所以弹出2。getName();//4这个没什么好说的,函数声明提升。Foo().getName();//1这个就比较微妙了。仔细看Foo函数,它的getName没有用var声明,所以这个getName实际上是window的,所以window的getName会被重新赋值。而它最后又返回了this,由于没有用new调用,所以这里的this是window。综上,最终弹出的是1。getName();//1上一步把window的getName重新赋值了,所以这里弹出1。newFoo.getName();//2这里的new没有任何作用。因为Foo没有加括号,所以它实际上是先调用Foo.getName(),弹出2,然后再去new它的返回结果,也就是undefined。newFoo().getName();//3这个加了括号,所以是先new一个Foo对象,再去调它的getName方法。Foo对象自身没有getName方法,去它的原型上去找,也就是弹出3的那个。newnewFoo().getName();//3最前面的new没意义,实际执行的时候是这样的:new(newFoo().getName()),括号里的与前一条相同,最后的返回值为undefined,所以最前面那个new没有实际意义。
添加回答
举报
0/150
提交
取消