PyPyBridge

对象字面量、原型与类

JS 的原型链和 this 动态绑定不存在了;self 显式,属性公开,dataclass 承担工厂函数的角色。

12 分钟 · 右栏代码可点击「运行」


类:constructor → __init__,this → self

JavaScript
1class Counter {
2 #count = 0; // 私有字段
3 constructor(start) {
4 this.count = start;
5 }
6 inc() { return ++this.count; }
7}
Python
1class Counter:
2 def __init__(self, start: int):
3 self.count = start # 公开属性,无 #
4
5 def inc(self) -> int:
6 self.count += 1
7 return self.count
  • 方法之间没有逗号;this 是隐式绑定,self 是显式参数 —— 永远不存在 this 指向丢失的问题。
  • 真正私有:self._x(约定)或 self.__x(名称改写)。没有 #语法。

工厂函数 / 对象拼接 → dataclass

JavaScript
1function makeUser(name, role = "dev") {
2 return { name, role, createdAt: Date.now() };
3}
4const u = makeUser("ada");
Python
1from dataclasses import dataclass, field
2import time
3
4@dataclass
5class User:
6 name: str
7 role: str = "dev"
8 created_at: float = field(
9 default_factory=time.time)
10
11u = User("ada")
  • JS 的对象字面量日常角色在 Python 由 dict + dataclass 分摊:动态数据用 dict,有行为的数据用 dataclass。
  • 可选链 u?.profile?.email → 嵌套取值用 try/except KeyError 或 getattr(getattr(u, 'profile', None), 'email', None) —— 更常见的答案是修正数据模型。

TIP

鸭子类型依旧JS 开发者不需要 interface 就能传对象 —— Python 一样,而且 typing.Protocol 让你把这个约束写下来给静态检查器看,两边的好处都拿到。

练一练

这张卡的示例代码已在游乐场中备好,改一改再运行。

在游乐场中打开