【Javascript】js在面向对象中使用闭包构建静态私有成员

js在面向对象中使用闭包构建静态私有成员

js的面向对象可谓是一言难尽啊,不过也造就了他的灵活

var ATM = (function () {
  // 静态私有成员 余额/ATM记录(类似于传统面向对象语言的 private static int xxx = 1000)
  let balance = 1000
  const record = []

  // 创建构造方法 (类似于传统面向对象语言的 public class_name(){})
  function _atm(name = '') {
    this.name = name
    // 公有实例方法 (类似于传统面向对象语言的 public void withdraw(){})
    this.withdraw = function (amount) {
      if (balance >= amount) {
        balance -= amount
        _log(this.name, amount)
      } else {
        console.log('余额不足,当前ATM余额 ¥' + balance)
      }
    }
  }
  // 构建原型静态公有方法 查询ATM余额(传统面向对象里没有prototype,任何实例可以访问并修改,但是这个方法不属于实例)
  _atm.prototype = {
    balance(echo = false) {
      if (echo) record.forEach((v) => console.log(v))
      else return balance
    }
  }

  // 静态私有方法 用于存储取款记录(类似于传统面向对象语言的 private static void xxx(){})
  function _log(name, amount) {
    record.push(name + '取款 ¥' + amount + ' ATM余额 ¥' + balance)
  }
  return _atm
})()

// 小明和小红分别进行取款
let xm = new ATM('小明')
xm.withdraw(200)
xm.withdraw(500)

let xh = new ATM('小红')
xh.withdraw(100)

// 小张来过来查询下ATM取款记录
let xz = new ATM()
xz.balance(true)

// 以上打印输出
// 小明取款 ¥200 ATM余额 ¥800
// 小明取款 ¥500 ATM余额 ¥300
// 小红取款 ¥100 ATM余额 ¥200
原文地址:https://www.cnblogs.com/bc8web/p/7895479.html