在 JS 中创建一个真正的 private 方法有什么缺点?

每个对象都会创建一个 private 方法的副本,这样很耗费内存。

var Employee = function(name, company, salary) {
    this.name = name || "";
    this.company = company || "";
    this.salary = salary || 5000;

    // Private method
    var increaseSalary = function() {
        this.salary = this.salary + 1000;
    };

    // Public method
    this.displayIncreasedSalary = function() {
        increaseSalary.call(this);
        console.log(this.salary);
    };
};

// Create Employee class object
var emp1 = new Employee("John", "Pluto", 3000);
var emp2 = new Employee("Merry", "Pluto", 2000);
var emp3 = new Employee("Ren", "Pluto", 2500);

在这里 emp1、emp2、emp3 都有一个 increaseSalary 私有方法的副本。

补充:

  • 这种"在构造函数里定义私有方法"的方式实质上是用 闭包 实现封装,每个实例都会创建一份新的闭包,造成内存浪费(注意原代码中 increaseSalary 没有绑定 this,原文调用也有笔误)。
  • ES6 之后推荐的私有写法:
    class Employee {
      #increaseSalary() {  // 私有方法
        this.salary += 1000;
      }
      displayIncreasedSalary() {
        this.#increaseSalary();
        console.log(this.salary);
      }
    }
    
  • 兼容性:# 私有字段/方法要求 ES2022+(Chrome 74+、Safari 14.1+),老项目可继续用 TypeScript private 关键字或 WeakMap 模拟。