约定以 _ 开头的属性为私有属性

这种不是真正的私有属性,可以直接访问自定义的私有属性命名

class ClassA {
  constructor(x) {
    this._x = x
  }
  getX() {
    return this._x
  }
}

const a = new ClassA(1)
// 可以直接访问自定义的私有属性命名
console.log(a._x)      // 1
console.log(a.getX())  // 1

内部变量版

class ClassB {
  constructor(x) {
    let _x = x
    this.getX = function() {
      return _x
    }
  }
}
const b1 = new ClassB(1)
console.log(b1._x)                // undefined
console.log(b1.getX())            // 1

const b2 = new ClassB(2)
console.log(b1.getX(), b2.getX()) // 1 2

闭包版

普通闭包版(实例之间会共享变量)
const ClassA = (function() {
  let _x
  return class {
    constructor(x) {
      _x = x
    }
    getX() {
      return _x
    }
  }
})()

const a1 = new ClassA(1)
console.log(a1._x)                // undefined
console.log(a1.getX())            // 1
console.log(a1 instanceof ClassA) // true

const a2 = new ClassA(2)
console.log(a1.getX(), a2.getX()) // 2 2 --- 实例之间会共享变量!!!

By lxcss

发表评论

您的电子邮箱地址不会被公开。 必填项已用*标注