<script>
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(); //3
new new Foo().getName(); //3
</script>
(1)getname()是Foo对象的静态方法;直接调用;
function People(name){
var name = name; //私有属性
this.name = name; //公有属性
function getName(){ //私有方法
return name
}
}
People.prototype.getName = function(){ // 公有方法
return this.name;
}
People.age = 18; //静态属性
People.getName = function(){ //静态方法
return this.age;
}
console.log(People.getName());//18
(2)涉及变量提升
函数声明
function getName() { console.log (5);}
函数表达式
var getName = function () { console.log (4);};
变量及函数声明会变量提升,表达式则不会
经过变量提升后,4输出把5输出覆盖掉了
var getName = undefined;
getName = function (){
console.log (5);
}
var getName = function () { console.log (4);};
(3)
函数调用和成员访问一个优先级,所以从左往右
Foo()执行其函数体,将全局的getName()改为输出1,同时返回this=window,然后调用window.getName()输出1
(4)调用全局的getName();已经被改写为输出1.
(5)
new Foo.getName(); new不带参比成员访问优先级低,相当于new (Foo.getName)();
Foo.getName 是function () { console.log (2);}; 即是 new f(){} ();function () { console.log (2);}作为构造函数,输出2
(6)new Foo().getName();
new带参数,成员访问。函数调用同一优先级,从左往右,
new了实例之后调用原型的函数 输出 3
(7)new new Foo().getName();
new带参 ,“." 高于new不带参,相当于
new ((new Foo()).getName)() 输出3;