知识卡片
扩充类型要克制
内容
给基本类型原型加方法会立即对所有实例生效;原型公用,多库混用易冲突,应只在确认方法不存在时才添加。扩充方法默认被 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`),从而在源头避免污染,属于对原书方案的现代补充。
- 原始内容:通过给基本类型增加方法,我们可以极大地提高语言的表现力……基本类型的原型是公用结构,所以在类库混用时务必小心。一个保险的做法就是只在确定没有该方法时才添加它。