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

简介: 【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中创建具有私有变量和私有方法的闭包,实现数据的封装和隐藏,提高代码的可维护性和安全性。不同的方式适用于不同的场景,开发者可以根据具体的需求选择合适的方法来创建闭包。

相关文章
|
6月前
|
JavaScript 前端开发 数据安全/隐私保护
闭包对于保护私有变量和函数的作用
JavaScript中的闭包用于创建私有作用域,保护变量和函数不被外部直接访问。它们实现封装和信息隐藏,防止全局命名冲突,确保数据安全和稳定性。闭包还支持访问控制和持久状态保持,常用于模块化、数据隐藏等,增强代码的可维护性、可重用性和安全性。
|
18天前
|
JavaScript 前端开发 开发者
|
6月前
|
Python
静态属性详解:代码揭秘与实用指南
静态属性详解:代码揭秘与实用指南
39 1
|
Java
闭包,类装饰lianx
当一个函数的返回值是另外一个函数,而返回的那个函数如果调用了其父函数内部的变量,且返回的这个函数在外执行就产生了闭包.闭包是一个环境,具体指的就是外部函数–高阶函数。 闭包有3个特性: ①函数嵌套函数 ②函数内部可以引用函数外部的参数和变量 ③参数和变量不会被垃圾回收机制回收
52 0
|
Java 编译器
构造函数中为什么要用this关键字?
构造函数中为什么要用this关键字?
77 0
|
存储 设计模式 JavaScript
对象方法和方法中的 "this"
对象方法和方法中的 "this"
128 0
对象方法和方法中的 "this"
【Groovy】闭包 Closure ( 闭包类 Closure 简介 | this、owner、delegate 成员区别 | 静态闭包变量 | 闭包中定义闭包 )(二)
【Groovy】闭包 Closure ( 闭包类 Closure 简介 | this、owner、delegate 成员区别 | 静态闭包变量 | 闭包中定义闭包 )(二)
161 0
【Groovy】闭包 Closure ( 闭包类 Closure 简介 | this、owner、delegate 成员区别 | 静态闭包变量 | 闭包中定义闭包 )(二)
闭包和对象
尊敬的大师 Qc Na 和他的学生 Anton 一起散步。Anton 希望能和大师展开一场讨论,于是说道:“老师,我听说对象是个非常好的东西,真的吗?“ 大师不屑地看了他的学生一眼,答道:“愚蠢的孩子,对象不过是穷人的闭包。”
113 0
闭包和对象
|
Java
Java中匿名子类 的 匿名对象、匿名子类 的 非匿名对象、非匿名类 的 匿名对象、非匿名类 的 非匿名对象
Java中匿名子类 的 匿名对象、匿名子类 的 非匿名对象、非匿名类 的 匿名对象、非匿名类 的 非匿名对象
224 0
【Groovy】闭包 Closure ( 闭包类 Closure 简介 | this、owner、delegate 成员区别 | 静态闭包变量 | 闭包中定义闭包 )(一)
【Groovy】闭包 Closure ( 闭包类 Closure 简介 | this、owner、delegate 成员区别 | 静态闭包变量 | 闭包中定义闭包 )(一)
167 0