猿问

几处代码不知是否理解正确?

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(); //4

Foo().getName(); //1 这里为什么是1呢?是因为Foo返回了this对象,这里的this对象是window,所以这句话的意思不是应该等同window.getName()??那应该是4啊为什么是1

getName(); // 1 这里变成1 是不是因为3的那一步Foo返回了this对象,所以改变了全局函数getName??所以返回1

new Foo.getName();//2

new Foo().getName(); //3

new new Foo().getName(); //3

5-7不是很理解,解释不出原因。

5是不是new关键字其实没起什么作用呢?都只是调用一个方法而已?


红颜莎娜
浏览 371回答 2
2回答

沧海一幻觉

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没有实际意义。
随时随地看视频慕课网APP

相关分类

JavaScript
我要回答