function Foo(){ getName=function(){alert(1);} console.log(this) return this; } Foo.getName=function(){alert(2);} Foo.prototype.getName=function(){alert(3);} var getName=function(){alert(4);} function getName(){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??所以返回1new Foo.getName();//2new Foo().getName(); //3new new Foo().getName(); //35-7不是很理解,解释不出原因。5是不是new关键字其实没起什么作用呢?都只是调用一个方法而已?
2 回答
沧海一幻觉
TA贡献1824条经验 获得超5个赞
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。
new Foo.getName();//2
这里的new没有任何作用。因为Foo没有加括号,所以它实际上是先调用Foo.getName(),弹出2,然后再去new它的返回结果,也就是undefined。
new Foo().getName(); //3
这个加了括号,所以是先new一个Foo对象,再去调它的getName方法。Foo对象自身没有getName方法,去它的原型上去找,也就是弹出3的那个。
new new Foo().getName(); //3
最前面的new没意义,实际执行的时候是这样的:new (new Foo().getName())
,括号里的与前一条相同,最后的返回值为undefined,所以最前面那个new没有实际意义。
添加回答
举报
0/150
提交
取消