创建一个私有变量和私有方法的闭包

简介: 【10月更文挑战第26天】可以在JavaScript中创建具有私有变量和私有方法的闭包,实现数据的封装和隐藏,提高代码的可维护性和安全性。不同的方式适用于不同的场景,开发者可以根据具体的需求选择合适的方法来创建闭包。

在JavaScript中,可以通过闭包来创建私有变量和私有方法:

立即执行函数表达式(IIFE)

  • 立即执行函数表达式是创建闭包的常用方式之一。通过在函数定义后立即添加括号来执行函数,函数内部的变量和方法将被封装在一个私有作用域中,外部无法直接访问。
var myModule = (function() {
   
  // 私有变量
  var privateVariable = 'This is a private variable';

  // 私有方法
  function privateMethod() {
   
    console.log('This is a private method');
  }

  // 返回一个包含公有方法的对象,这些公有方法可以访问私有变量和私有方法
  return {
   
    publicMethod: function() {
   
      console.log('This is a public method');
      console.log(privateVariable);
      privateMethod();
    }
  };
})();

myModule.publicMethod();
console.log(myModule.privateVariable); // 无法访问,输出undefined
myModule.privateMethod(); // 无法访问,报错
  • 在上述示例中,privateVariableprivateMethod被定义在立即执行函数内部,形成了私有变量和私有方法。外部只能通过返回的publicMethod来间接访问和调用私有变量和私有方法。

函数工厂模式

  • 函数工厂模式可以根据不同的参数创建具有不同私有状态的对象,每个对象都有自己的私有变量和私有方法,并且通过公有方法来暴露部分功能。
function createCounter() {
   
  // 私有变量
  let count = 0;

  // 私有方法
  function increment() {
   
    count++;
  }

  function decrement() {
   
    count--;
  }

  // 返回一个包含公有方法的对象
  return {
   
    getCount: function() {
   
      return count;
    },
    increment: increment,
    decrement: decrement
  };
}

var counter1 = createCounter();
var counter2 = createCounter();

counter1.increment();
console.log(counter1.getCount()); // 1
console.log(counter2.getCount()); // 0
  • 这里createCounter函数是一个工厂函数,每次调用它都会创建一个新的计数器对象,每个计数器对象都有自己独立的count私有变量和incrementdecrement私有方法,通过getCountincrementdecrement公有方法来操作和获取私有变量的值。

构造函数与原型链结合闭包

  • 这种方式利用构造函数创建对象,并通过原型链共享公有方法,同时在构造函数中使用闭包来创建私有变量和私有方法。
function Person(name) {
   
  // 私有变量
  var privateAge = 0;

  // 私有方法
  function setAge(age) {
   
    if (typeof age === 'number' && age >= 0) {
   
      privateAge = age;
    }
  }

  // 公有方法,通过闭包访问私有变量和私有方法
  this.getName = function() {
   
    return name;
  };

  this.getAge = function() {
   
    return privateAge;
  };

  this.setAge = setAge;
}

var person1 = new Person('John');
person1.setAge(30);
console.log(person1.getName()); // John
console.log(person1.getAge()); // 30

var person2 = new Person('Alice');
console.log(person2.getAge()); // 0
  • Person构造函数中,privateAgesetAge是私有变量和私有方法,每个Person实例都有自己独立的privateAge,并且可以通过公有方法getNamegetAgesetAge来访问和操作私有变量。

通过以上几种方式,可以在JavaScript中创建具有私有变量和私有方法的闭包,实现数据的封装和隐藏,提高代码的可维护性和安全性。不同的方式适用于不同的场景,开发者可以根据具体的需求选择合适的方法来创建闭包。

相关文章
|
7月前
|
JavaScript 前端开发 数据安全/隐私保护
闭包对于保护私有变量和函数的作用
JavaScript中的闭包用于创建私有作用域,保护变量和函数不被外部直接访问。它们实现封装和信息隐藏,防止全局命名冲突,确保数据安全和稳定性。闭包还支持访问控制和持久状态保持,常用于模块化、数据隐藏等,增强代码的可维护性、可重用性和安全性。
|
1月前
|
JavaScript 前端开发 开发者
|
6月前
|
存储 数据安全/隐私保护 C++
C++一分钟之-C++中的静态成员与静态函数
【6月更文挑战第20天】在C++中,静态成员(变量&函数)打破对象实例化规则,提供类级共享。静态变量独占一份,用于计数或共享配置,需类外初始化,注意访问权限。静态函数不依赖对象,直接通过类名调用,不使用`this`指针,适合工具函数或操作静态变量。示例展示了静态成员的使用,强调了理解和避免常见问题的重要性。
58 4
|
Java
7.1 深入理解闭包与内部类:闭包的概念与应用
7.1 深入理解闭包与内部类:闭包的概念与应用
255 0
|
自然语言处理 Java
7.2 深入理解闭包与内部类:内部类如何实现闭包
7.2 深入理解闭包与内部类:内部类如何实现闭包
134 0
|
Java 编译器
构造函数中为什么要用this关键字?
构造函数中为什么要用this关键字?
82 0
|
存储 编译器 C语言
【三、类中的静态成员】静态成员变量与静态成员函数(static关键字、this指针)
【三、类中的静态成员】静态成员变量与静态成员函数(static关键字、this指针)
161 0
|
编译器 C++
C++面向对象友元,全局函数、类、成员函数做友元
在程序里,有些私有属性 也想让类外特殊的一些函数或者类进行访问,就需要用到友元的技术 友元的目的就是让一个函数或者类 访问另一个类中私有成员 友元的关键字为 ==friend== 友元的三种实现 • 全局函数做友元 • 类做友元 • 成员函数做友元 全局函数做友元
140 0
C++面向对象友元,全局函数、类、成员函数做友元
|
C++
【C++ 语言】面向对象 ( 成员函数 | 常量函数 | 友元函数 | 友元类 | 单例类 )(一)
【C++ 语言】面向对象 ( 成员函数 | 常量函数 | 友元函数 | 友元类 | 单例类 )(一)
193 0
【C++ 语言】面向对象 ( 成员函数 | 常量函数 | 友元函数 | 友元类 | 单例类 )(一)
|
C++
【C++ 语言】面向对象 ( 成员函数 | 常量函数 | 友元函数 | 友元类 | 单例类 )(二)
【C++ 语言】面向对象 ( 成员函数 | 常量函数 | 友元函数 | 友元类 | 单例类 )(二)
156 0
【C++ 语言】面向对象 ( 成员函数 | 常量函数 | 友元函数 | 友元类 | 单例类 )(二)

热门文章

最新文章