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