大白话解释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 就乱套了;但做成私有,逼着外部只能通过你提供的“公有的取款方法”去操作,你就能在方法里加上“余额不足”之类的校验,保证数据永远不出错。这就是经典的封装思想。 😄

浙公网安备 33010602011771号