function Foo() {
getName = function () { console.log (1); };
return this;
}
Foo.getName = function () { console.log (2);};
Foo.prototype.getName = function () { console.log (3);};
var getName = function () { console.log (4);};
function getName() { console.log (5);}
//请写出以下输出结果:
Foo.getName(); //2, 函数的静态方法,直接调用相关函数就可以了。
getName(); //4, 变量函数定义在调用之前,成功完成初始化,覆盖函数声明方式定义的同名函数
Foo().getName(); //1, 这里 Foo()返回的 this 是 window,在 Foo调用时,对全局的变量型函数 getName 重新定义了,所以得到1。
getName(); //1, 上一句改变了全局的 getName 函数为 cosnole.log(1)
new Foo.getName(); //2,无参数 new 运算比 . 运算低,所以先运行 Foo.getName,得到2
new Foo().getName(); //3,有参数 new 运算和 . 运算同一等级,故从左到右,先运算 new Foo() 得到一个匿名对象,在该对象上调用 getName 函数得到3
new new Foo().getName(); //3,同上,先得到匿名对象,然后将该对象的方法 getName 当做构造函数来调用,得到一个新对象,并输出3;
不理解第三个Foo().getName();的解释,为什么下面这两句话没更改Foo()的getName的值呢?后面几个new的求解也不是很明白,什么是有参数无参数呢
Foo.getName = function () { console.log (2);};
Foo.prototype.getName = function () { console.log (3);};
先说第三个:
你可以分开来理解 foo() 执行:
第一步
window.getName = function(){console.log(1)};
第二步
return this
; foo()的调用对象为 window 即foo() == window.foo()
——>return this == return window ——> foo() == window.foo() == window;
通过第二步可以明白,
foo() == window ——> foo().getName() == window.getName()——> console.log(1);
下面的new 的第一个 :
new foo.getName() ——> foo.getName()
第二个
上面有定义
foo.prototype.getName;
第三个