知识卡片

扩充类型要克制

普通读书笔记卡 · 1492.d

内容

给基本类型原型加方法会立即对所有实例生效;原型公用,多库混用易冲突,应只在确认方法不存在时才添加。扩充方法默认被 for in 枚举出来污染遍历;现代可用 Object.defineProperty(...,{enumerable:false}) 从根源规避,不必只靠事后 hasOwnProperty 过滤。发散:扩展内建对象是全局行为,未完全控制环境时应谨慎。

参考来源

- 位置:《JavaScript语言精粹(修订版)》第4章《函数 Functions》"扩充类型的功能"一节;现代规避方法依据 [MDN Object.defineProperty](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/defineProperty) - 结论依据:原文示范给 Function.prototype、Number.prototype、String.prototype 增加方法的写法,说明新方法会立即对所有对象实例生效,同时警告"基本类型的原型是公用结构,所以在类库混用时务必小心",并给出"只在确定没有该方法时才添加"的防御写法;原书只给出事后用 hasOwnProperty 过滤 for-in 污染的办法,MDN 文档确认 `Object.defineProperty` 可将新增属性设为不可枚举(默认 `enumerable: false`),从而在源头避免污染,属于对原书方案的现代补充。 - 原始内容:通过给基本类型增加方法,我们可以极大地提高语言的表现力……基本类型的原型是公用结构,所以在类库混用时务必小心。一个保险的做法就是只在确定没有该方法时才添加它。