js中静态函数与变量

一 私有变量和函数

js中没有概念上的私有,公有也没有静态和非静态相关概念,有的只能是通过作用于来模仿

函数的块级作用域使得函数内部成员可以不被外部所访问,比如我们使用块级作用于定义一个类

//定义一个命名空间,用于相关类挂靠到该空间下,使得外部通过该命名空间访问某个类型

var MyLib = window.MyLib = MyLib || {};

(function{

  // 在函数内部 name 是不会被外部直接能够访问的,除非通过方法暴露接口

  var name='';

  //同样的道理,如果定义一个函数,那么他也是属于该函数块级作用域私有函数并且并不属于某一个实例

  function Hello(){};

  //使用函数表达式定义一个类,如果仅使用var定义一个函数表达式,函数外部也是访问不到的因此需要增加一个命名空间“MyLib”

  var Person=MyLib.Person=function(){

    this.name=''xx';

  }

  

  Person.prototype.say=function(){

    alert('speack chinese');

  }

})()

使用该类型

var p=new MyLib.Person();

注意此时是不能访问到name变量和Hello函数,因为没有任何形式将其暴露到外部,所以这2个成员属于(function(){})()块级作用域私有静态成员,对于类的实例来说,name和函数hello也均是静态的共享的。

如果有需要访问该2个成员是 我们可以通过Person的原型方法向外暴露接口

Person.prototype.getName=function(){

  return name;//注意返回的name而不是this.name;这两则是有明显区别的

}

二 块级模式

看代码

var appInfo=function(){

  var appName='xxx';

  var showInfo=function(){

    alert('appinfo');

  }

  return {

    appName:appName,

    Info:showInfo

  }

}

所谓的块级模式其实就是单例模式,某个类型的数据封装只有一份实例,通过字面量向外暴露接口,可见其本事上函数表达式和函数作用于的杰作

再则所谓的块级增强模式,见代码

var appInfo=function(){

  var appName='xxx';

  var showInfo=function(){

    alert('appinfo');

  }

  var App=new Object();

   App.appName=appName;

   App.Info=showInfo;

  return App;

}

所谓的增强只是一种说法而已,并没有建的通过字面量创建的对象就没有开放,其实对外都是开放的,只不过内部的成员是不开放了,也许这就是所谓的半闭半开吧

原文地址:https://www.cnblogs.com/rjjs/p/5462681.html