js对象,类与原型链问题

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);};
阅读 898
1 个回答

先说第三个:
你可以分开来理解 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()

第二个

(new foo()).getName() ——> let n = new foo();n.getName();

上面有定义 foo.prototype.getName;

第三个

[new (new foo()).getName()] ——> (new foo.prototype.getName()) 

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题