严格来讲,JS之中没有私有成员的概念;所以对象属性都是公有的。不过,倒是有一个私有变量的概念。

任何在函数中定义的变量,都可以认为是私有变量,因为不能在函数的外部访问这些变量。

私有变量包括函数的参数,局部变量和函数内部定义的其他函数。

我们把有权访问私有变量和私有函数的公有方法叫做特权方法

有两种在对象上创建特权方法的方式

(1)在构造函数中

function MyObject () {

  // 私有变量和私有函数

  var privateVariable = 10;

  function privateFunction () {

    return false;

  }

  //特权方法

  this.publicMethod = function () {

    privateVariable++;

    return privateFunction();

  };

}

能够在构造函数中定义特权方法,是因为特权方法作为闭包有权访问在构造函数中定义的所有变量和函数。

上述除了publicMethod()这个途径外,没有任何方法可以访问privateVariable和privateFunction()

利用私有和特权成员,可以隐藏那些不应该被直接修改的数据,例如:

function Person (name) {

  this.getName = function () {    // 特权方法

    return name;

  };

  this.setName = function (value) {   //特权方法

    name = value

  }

}

构造函数中定义特权方法也有一个缺点,针对每个实例都会创建同样一组新方法,而使用静态私有变量来实现特权方法可以避免这个问题

(2)静态私有变量

通过在私有作用域中定义私有变量或函数,同样也可以创建特权方法,其基本模式如下所示。

(function () {

  var privateVariable = 10;

  function privateFunction () {

    return false;

  }

  MyObject = function (){    // 没有使用var声明,变成了全局变量

  };

  MyObject.prototype.publicMethod = function () {

    privateVariable++;

    return privateFunction();

  }

})();

而且方法定义在原型上,被所有实例所共享,如下:

(function(){

  var name = "";

  Person = function (value) {

    name = value;

  }

  Person.prototype.getName = function () {

    return name;

  };

  Person.prototype.setName = function () {

    name = value;

  }

}) ();

 var person1 = new Person('Nicholas');

 alert(person1.getName()); // 'Nicholas'

 person1.setName('Greg');

 alert(person1.getName()); // 'Greg'

 

 var person2 = new Person('Michael');

 alert(person1.getName()); // 'Michael'

 alert(person2.getName()); // 'Michael'

 如上,对一个实例操作会影响所有的实例,

 以这种方式创建静态私有变量会因为使用原型而增进代码复用,但每个实例都没有自己的私有变量。

 到底是使用实例变量,还是静态私有变量,还是看个人需求吧

(3)模块模式(单例对象)

  var application = function () {

    // 私有变量和函数

    var components = new Array();

    //初始化

    components.push(new BaseComponent());

    // 公共

    return {

      getComponentCount: function () {

        return components.length;

      },

      registerComponent: function(component) {

        if (typeof component == 'object') {

          components.push(component);

        }

      }

    };

  } ();

如果必须创建一个对象并以某些数据对其进行初始化,同时还要公开一些能够访问这些私有数据的方法,那么就可以使用模块模式

JS 私有变量的更多相关文章

  1. js私有变量

    js私有变量 一.总结 1.在js函数中定义 this.name='张三'; (函数的属性)外部是可以访问的,但是 var name='张三'; (函数的私有变量),这样定义的话外部没有办法访问 2. ...

  2. js对象私有变量公有变量问题

    0 js对象私有变量公有变量问题5 小弟初学JS面向对象编程 现有一问题 请教各位大虾: Person=function (){ //私有变量定义 var name; vae age; var Ale ...

  3. [js]js代码执行顺序/全局&私有变量/作用域链/闭包

    js代码执行顺序/全局&私有变量/作用域链 <script> /* 浏览器提供全局作用域(js执行环境)(栈内存) --> 1,预解释(仅带var的可以): 声明+定义 1. ...

  4. js实现私有变量

    一.块级作用域 js中没有块级作用域的概念,可用匿名函数实现,由于匿名函数执行完一遍后,内部没有引用其变量对象的函数,其变量对象被清除,后面则引用不到其中的变量 (function(){ //块级作用 ...

  5. 理解js中私有变量

    私有变量在js中是个什么概念.当下我的认识是var所定义的变量,实际可以理解为属性和方法,或者单单是临时存储器,不归属任何对象. 一个声明函数: function a(){  var v = &quo ...

  6. js静态私有变量(将方法变成原型模式,被所有实例共享,而方法操作变量,故变量是静态)

    js静态私有变量(将方法变成原型模式,被所有实例共享,而方法操作变量,故变量是静态) 一.总结 1.js函数中的private和public:js函数中的私有变量 var 变量名,公有变量 this. ...

  7. js 静态私有变量

    特权方法:有权访问私有变量和私有函数的公有方法.在私有作用域中定义私有变量或函数,可以创建特权方法,如下: 示例1 (function(){ //私有变量和私有函数 var privateVariab ...

  8. JS中的 公有变量、私有变量 !

    公有变量.私有变量 ! 初学者的见解,算是记录学习过程,也算是分享以便共同成长,如有不正确的地方,还请不吝赐教! 先看代码1: function car(){ var wheel = 3; //私有变 ...

  9. 【JS笔记】私有变量

    1.任何函数中定义的变量都可以认为是私有变量.函数内部可以访问,外部不能访问. 可以通过闭包创建特权方法访问私有变量. function Foo(){ var n=10; this.returnN=f ...

随机推荐

  1. httpstatus类的状态有哪些

    HTTP Status Code 常见的状态码: HTTP: Status 200 – 服务器成功返回网页HTTP: Status 404 – 请求的网页不存在HTTP: Status 503 – 服 ...

  2. 20165206第4次实验《Android程序设计》实验报告

    20165206第4次实验<Android程序设计>实验报告 一.实验报告封面 课程:Java程序设计 班级:1652班 姓名:韩啸 学号:20165206 指导教师:娄嘉鹏 实验日期:2 ...

  3. Paddington2

  4. svn_linux + apache 实现网页访问svn

    CentOS7:搭建SVN + Apache 服务器实现网页访问 1. 安装httpd 安装httpd服务: $ sudo yum install httpd 检查httpd是否安装成功: $ htt ...

  5. OpenAuth.Net.landv分支之旅开始制作CRM系统

    OpenAuth.Net.landv分支之旅开始制作CRM系统 这个事件的由来是因为没有一个统一的会员卡平台系统,目前需要连接三家酒店会员系统,由于三家酒店使用了三种酒店管理系统,彼此之间的耦合低.三 ...

  6. 实现用VB.Net/(C#)开发K/3 BOS 插件的真正可行方法

    转了这一篇文章,原来一直想用C#做k3的插件开发,vb没有C#用的爽呀,这篇文章写与2011年,看来我以前没有认真去找这个方法呀. https://blog.csdn.net/chzjxgd/arti ...

  7. ubuntu下的“用vim打开中文乱码,用cat打开正常显示”的解决方法

    转载 系统环境:ubuntu10.04 vim gvim完全安装 问题:终端下vim中的汉字为乱码,网上搜索了一些解决方案.但是奇怪的是,这些方法都不能实现gvim的菜单和文中汉字,终端vim下的文中 ...

  8. 真的分治fft

    以前学的分治fft f[i]=sigma(f[i-x]*g[x]),其中g[x]已知 那么我们可以用cdq分治来做(l,mid 对mid+1,t的影响) 而现在的$f[i]=sum(f(i-x)*f( ...

  9. python之 MySQLdb 实践 爬一爬号码

    0.目录 2.构建URL3.新建数据库4.新建汇总表5.定义连接数据库函数:connect_db(db=None, cursorclass=DictCursor)6.汇总表填充必要数据7.新建各省份子 ...

  10. 数据特征分析:1.基础分析概述& 分布分析

    基础分析概述 几个基础分析思路: 分布分析 对比分析 统计分析 帕累托分析 正态性检测 相关性分析 分布分析 分布分析是研究数据的分布特征和分布类型,分定量数据.定性数据区分基本统计量. import ...