Foo.getName() 经典解析

构造函数的静态属性 : 直接定义在构造函数上的属性或者方法,称为静态成员,可以通过构造函数Fn自身访问,实例无法访问。应用:JS的Memoization(记忆化)模式

构造器属性: 写在构造函数里的this.name=name

实例的属性,只有实例可以访问,构造函数自身无法访问

 原型属性Fn.prototype.sayName=function(){ }


变量声明与函数声明提前:

变量声明提前,声明提前到代码最上层,赋值停留在原地。

函数声明提前,注意是函数声明function,不是函数表达式。所以可以在声明之前调用函数。

函数声明提前 >  变量声明提前


题:

functionFoo() {

    getName = function () {

        console.log(1);

    };

    returnthis;

};


Foo.getName= function () {

    console.log(2);

};


Foo.prototype.getName= function () {

    console.log(3);

};


vargetName = function () {

    console.log(4);

};


functiongetName() {

    console.log(5);

};



Foo.getName();//2

解析:构造函数的静态属性(方法)


getName();//4

解析:函数声明提前 >  变量声明提前,所以var getName覆盖了function getName


Foo().getName();//1

解析:执行Foo()函数的时候,全局的getName函数被覆盖,所以输出1


getName();//1

解析:因为 上一步全局的getName函数被覆盖,所以输出1


new Foo.getName();//2

解析:执行顺序 1、a=Foo.getName;2、new a();

第一步执行得到一个函数,但是它内部没有提供任何构造器属性,

所以第二步new这个方法只能得到一个空属性的实例。


new Foo().getName();//3

解析:执行顺序1、a = new Foo();2、a.getName();

第一步得到一个实例,this指向新建的对象

第二步调用实例对象原型上的getName方法。


new new Foo().getName(); //3

解析:执行顺序:1、a = new Foo();2、b = a.getName;

3、new b();

第一步得到一个实例,this指向新建的对象

第二步得到实例对象原型上的getName方法,但是它内部没有提供任何构造器属性

第三步所以new这个方法只能得到一个空属性的实例


new Foo() 的优先级大于 new Foo

你可能感兴趣的:(Foo.getName() 经典解析)