对象字面量、原型与类
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 # 公开属性,无 #45 def inc(self) -> int:6 self.count += 17 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, field2import time34@dataclass5class User:6 name: str7 role: str = "dev"8 created_at: float = field(9 default_factory=time.time)1011u = 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 让你把这个约束写下来给静态检查器看,两边的好处都拿到。
练一练
这张卡的示例代码已在游乐场中备好,改一改再运行。