私有变量和特权方法

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

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

实例引入

function add(num1,num2){
  let sum  = num1 + num2;
  return sum;
}
// 在函数中,有3个私有变量:num1、num2以及sum
console.log(sum);
// ReferenceError: sum is not defined

在函数内部可以访问其私有变量,但在函数外部则不能访问。所以可以利用该特点在函数内部创建一个闭包,闭包在通过作用域链去访问私有变量,从而实现访问私有变量的公有方法。

在JavaScript中,我们将有权访问私有变量和私有函数的公有方法称为特权方法。

创建特权方法的方式

在构造函数中和定义特权方法
function MyObject(){ 
 //私有变量和私有函数
 let num = 10; 
 function fun(){ 
 return false; 
 } 
 //特权方法
 this.publicMethod = function (){ 
 num++; 
 return fun(); 
 }; 
} 

很明显在上面的模式下,在构造函数内部定义了私有变量和函数,然后又创建了能够访问这些私有成员的特权方法,这就实现了在创建函数实例后,只能通过fun()函数去访问实例中的私有变量和私有函数。

使用静态私有变量实现特权方法

通过在私有作用域中定义私有变量或函数来创建特权方法

(function(){ 
 
 //私有变量和私有函数
 let num = 10; 
 function fun(){ 
 return false; 
 } 
 //构造函数
 MyObject = function(){ 
 }; 
 //公有/特权方法
 MyObject.prototype.public = function(){ 
 num++; 
 return fun(); 
 }; 
})(); 

该模式创建了一个私有作用域,并封装了一个构造函数及相应的方法。在私有作用中, 定义了私有变量和私有函数,然后又定义了构造函数及其特权方法。特权方法是在原型上定义的, 这一点体现了典型的原型模式 。

由于在函数中未定义MyObject,所以在运行环境中MyObject就作为一个全局变量,能够在私有作用域之外被访问到。 这个模式与在构造函数中定义特权方法的主要区别,就在于私有变量和函数是由实例共享的。由于特权方法是在原型上定义的,因此所有实例都使用同一个函数。

使用模块模式创建特权方法

模块模式是为单例创建私有变量和特权方法。

所谓单例,指的就是只有一个实例的对象。

var singleton = { name : value, method : function () { 
  //这里是方法的代码 
} };

模块模式通过为单例添加私有变量和特权方法能够使其得到增强,其语法如下:

 let normalFun = function(){ 
   //私有变量和私有函数 
   let num = 10;
   function fun(){
     return false;
   }
    //特权方法和属性 
return {
  publicProperty: true, 
  publicMethod : function(){
        num++;
        return fun(); 
    } 
  }; 
 }(); 

这个模块模式使用了一个返回对象的匿名函数(normalFun)。在这个匿名函数内部,首先定义了私有变量(num)和函数(fun)。返回的对象字面量中只包含可以公开的属性(publicProperty)和方法(publicMethod)。由于这个对象是在匿名函数内部定义的,因此它的特权方法有权访问私有变量和函数。

从本质上来讲,这个对象字面量定义的是单例的公共接口。

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

总结

有权访问私有变量的公有方法叫做特权方法。

可以使用构造函数模式、原型模式来实现自定义类型的特权方法,也可以使用模块模式来实现单例的特权方法。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值