构造函数的静态属性 : 直接定义在构造函数上的属性或者方法,称为静态成员,可以通过构造函数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