大白话解释class的公有和私有

1. 大白话比喻

  • 公有(Public):相当于你的微信头像和昵称。谁都能看,随便点进去就能访问,改了大家也都知道。

  • 私有(Private):相当于你的银行卡密码。只有你自己(类内部的方法)知道,别人从外面想直接看或者改,门儿都没有(报错)。

2. 语法怎么写?(记住 # 这个符号)

在 JS 里,私有的标志就是 # 号(不加 # 默认全都是公有的)。

class BankAccount {
  // 公有属性(外面随便看)
  publicName = '张三的账户';

  // 私有属性(加 #,外面绝对看不到)
  #balance = 1000; 
  
  // 私有方法(加 #,内部工具函数,外面调不动)
  #reduceFee() {
    console.log('内部扣手续费逻辑');
  }

  // 公有的方法(专门用来操作私有密码)
  getMoney(amount) {
    if (amount <= this.#balance) {
      this.#balance -= amount;
      this.#reduceFee(); // 内部可以调用私有方法
      return '取款成功';
    }
    return '余额不足';
  }

  // 公有的查看余额方法(只能看,不能改)
  checkBalance() {
    return this.#balance;
  }
}

let myAccount = new BankAccount();

// 公有:随便访问
console.log(myAccount.publicName); // 输出:张三的账户 ✅

// 私有:强行访问直接报语法错误!
console.log(myAccount.#balance);   // ❌ 报错:Private field '#balance' must be declared in an enclosing class
console.log(myAccount.#reduceFee());// ❌ 报错,外面调不动

 


3. 继承(儿子和爹的关系)

这里有一个重要的坑要记住:私有属性亲爹不传儿子!
就算是儿子(子类)继承了爹(父类),儿子也绝对看不到爹的 # 私有属性和方法。爹藏起来的密码,亲儿子也不能直接碰。

class Son extends BankAccount {
  test() {
    console.log(this.#balance); // ❌ 报错!儿子也看不到爹的私有密码
  }
}

 


4. 补充一个老古董知识点(面试常问) 

在 # 出现之前,老一辈程序员习惯用 _ 下划线(比如 _balance)来表示“这是私有的,别动我”。

注意_balance 其实是假的私有,它只是程序员的“君子协定”(我加了下划线提醒你别碰,但你非要 myAccount._balance = 999,代码照样能跑,拦不住你)。
而 #balance 是真正的铁锁,JS 引擎从底层就不让你访问,谁来了都不好使。


总结一句顺口溜:

不加 # 是公有,人人都能摸一摸;
加上 # 是私有,亲儿子来也发抖;
下划线是假把式,真锁还得靠 # 头。

现在你知道了权限,下一个问题肯定是:那我为什么要费劲搞私有呢?
最大的好处就是防止外部乱改。比如余额只能是正数,如果全部公开,外面来个 account.balance = -1000 就乱套了;但做成私有,逼着外部只能通过你提供的“公有的取款方法”去操作,你就能在方法里加上“余额不足”之类的校验,保证数据永远不出错。这就是经典的封装思想。 😄

posted @ 2026-07-01 14:07  小囧光  阅读(4)  评论(0)    收藏  举报