标签:优化 obj class java 变量 code prototype 全局 logs
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 getName(); //1 new Foo.getName(); //2 => new (Foo.getName)() new无参数列表 new Foo().getName(); // 3 => (new Foo()).getName(); //new有参数列表 new new Foo().getName(); //3 => new ((new Foo()).getName)() //new有参数列表
输出结果为:2
原理:他调用的是Foo的静态方法(如果C#、java等后端语言来说),其实是因为Javascript中的Function本身就是Function和Object的结合,所以function既是函数,也是对象。在这里Foo就是执行了他对象上的一个function而已。
输出结果为:4
原理:可能你会想为什么不是5,function变量会提升到作用域的顶部,而var定义的则不会,所以var声明的覆盖掉function声明。所以结果为4
输出结果为:1
原理:Foo()是函数调用,Foo执行体中对getName进行了重新赋值(全局的getName,根据作用域链向上查找),返回的this为window(Foo执行时没有调用,默认为全局),然后.getName()调用了全局的getName(也就是被Foo执行体重写的getName),所以结果为:1
输出结果为:1 原理:因为Foo执行体中对全局getName重写了,这时调用的又是全局的getName。所以结果为:1
输出结果为:2
原理:
输出结果为:3
原理:
输出结果为:3
原理:主要是运算符优先级的考查,实例开发中应该不会这样直接的用到。首先new有参,然后.getName(.运算符)(为什么是.运算符,这是因为new无参级别低一个档次),再则new有参。
标签:优化 obj class java 变量 code prototype 全局 logs
原文地址:http://www.cnblogs.com/cqhaibin/p/6798465.html