面试题实际应用

function Foo() {//这是一个方法,也可以是一个没有实例的类

    getName = function(){ alert(1); };//这是foo方法里的一个方法,只能在方法里访问得到,别的地方都访问不到。

    return this;//这里返回的是全局window对象,并不是foo本身的实例。

}

//

//console.log(Foo());//你这里是执行了这个方法,里面返回了一个this,也就是window对象。

Foo.getName = function() { alert(2); };//这里是在foo方法上加了方法getname,也就是把foo方法当成对象了。

Foo.prototype.getName = function(){ alert(3); };//这里的意思是在foo所有的实例对象上加了个方法getnanme,和上面的不一样。

var getName = function() { alert(4); };//这是是全局的var方法,this访问不到,只有直接getname才能执行。

function getName(){ alert(5); }//这是一个全局的this方法,this也就是window访问的到。

//

Foo.getName(); //这个很简单吧,是2

getName(); //这个是4

Foo().getName(); // foo()返回this,也就是window,是5

this.getName(); // 这个也是5

new Foo.getName(); // 这个先会执行foo.getname,返回的是一个function方法,new foo.getname 就会返回方法的实例,所以里面的内容也会被执行,也会弹出2

new Foo().getName(); // 这里会先实例foo,foo的实例再执行getname方法,也就是Foo.prototype.getName。所以3

new new Foo().getName(); // 这里会先执行new Foo()得到foo的实例,再获得到getname方法,也就是new foo().getname 得到一个方法,然后又被new,这时候getname被执行也就是弹出了3

记住,new (这里不管是什么都先执行)()

new Foo.getName() 先执行foo.getname

new Foo().getName() 先执行foo

new new Foo().getName()先执行foo,然后执行 new foo().getname

你可能感兴趣的:(面试题实际应用)