1 function Foo() { getName = function () { alert (1); }; //定义静态属性 没有用var来声明 会修改window下getName的值 return this; this的指向是由调用的方式决定的 函数调用的方式this指向window 对象下的方法调用指向对象 } 2 Foo.getName = function () { alert (2);};//为静态属性改值 3 Foo.prototype.getName = function () { alert (3);}; 4 var getName = function () { alert (4);};解析时不会变量提升 执行时赋值 5 function getName() { alert (5);} 解析时变量提升 执行时什么也不做 //请写出以下输出结果: Foo.getName();//静态属性的值 2 getName();只和4,5有关 预解析时函数表达式不会变量提升 函数声明会变量提升 执行时按照预解析顺序执行 执行时遇到函数表达式赋值 遇到函数声明什么也不做 所以getname()执行的是getName = function () { alert (4);} Foo().getName(); 1 getname是私有静态属性 实例不能调用 可以通过函数调用的方式使用 注意此时没有var声明 会修改window下getName的值 getName(); new Foo.getName(); new (foo.getname())() 2 new Foo().getName(); new Foo()实例下没有getname方法 去原型中查找 3 new new Foo().getName(); 实例下的getname()没有 去原型中找 将原型中的方法实例化
function User(name) { var name = name; //私有属性 this.name = name; //公有属性 通过this prototype定义的是公有的属性和方法,并且必须通过实例化才可以使用 function getName() { //私有方法 函数内部的私有属性和方法 实例不可以使用 通过函数调用的方法可以直接使用 return name; } } User.prototype.getName = function() { //公有方法 return this.name; } User.name = 'Wscats'; //静态属性 User.getName = function() { //静态方法 return this.name; } var Wscat = new User('Wscats'); //实例化
注意下面这几点:
-
调用公有方法,公有属性,我们必需先实例化对象,也就是用new操作符实化对象,就可构造函数实例化对象的方法和属性,并且公有方法是不能调用私有方法和静态方法的
-
静态方法和静态属性就是我们无需实例化就可以调用
-
而对象的私有方法和属性,外部是不可以访问的
函数表达式和函数声明 js预解析 函数声明会变量提升 函数表达式不会变量提升 js执行时按照预解析的顺序进行执行 遇到函数调用执行 遇到函数表达式赋值 遇到函数声明什么也不做 getName() //oaoafly 1 执行时在预解析的顺序里执行 返回oaoafly var getName = function() { 2 预解析getname=undefined 执行给getname赋值=function(){wscat} console.log('wscat') } getName() //wscat 3 执行返回wscat function getName() { 4预解析getname=function(){oaoafly} 执行遇到函数声明什么也不做 console.log('oaoafly') } getName() //wscat 5 执行返回wscat