不建议直接修改内置对象原型,应优先使用独立工具函数、Symbol私有属性、子类继承等方式安全扩展;必要时补丁原生原型需加存在性检查、严格模式和作用域隔离。

不建议直接在内置对象原型(如 Array.prototype、String.prototype)上添加方法,因为会污染全局环境、引发命名冲突、破坏第三方库或未来标准行为。真正安全的扩展方式,是绕过“直接修改原生原型”这个高危路径,用更可控、更隔离的机制达成类似效果。
用独立工具函数替代原型方法
把想实现的功能写成纯函数,显式传入目标值,完全不碰原型链:
-
避免:
Array.prototype.last = function() { return this[this.length - 1]; }; -
推荐:
const last = arr => Array.isArray(arr) ? arr.at(-1) : undefined;,调用时写last(myArray) - 可归类组织,比如
const ArrayUtils = { last, chunk, unique };,既清晰又无副作用
用 Symbol 属性做私有挂载
若必须在实例上存状态或逻辑(例如调试标记、内部缓存),用 Symbol 创建唯一键名,避免被枚举、覆盖或意外访问:
const $cache = Symbol('array-cache');-
Array.prototype[$cache] = new WeakMap();(注意:这里仅用于演示隔离意图;实际中更推荐在函数作用域内管理) - 该属性不会出现在
for...in、Object.keys()或 JSON 序列化中,只可通过Object.getOwnPropertySymbols()获取
通过子类继承封装增强能力
需要一组专属方法且希望保持面向对象风格?继承内置类,新方法只对子类实例生效:
立即学习“Java免费学习笔记(深入)”;
class SmartArray extends Array { first() { return this[0]; } last() { return this.at(-1); } }const arr = new SmartArray(1, 2, 3); arr.last(); // ✅ 3-
Array.isArray(arr) // ✅ true,兼容性有保障 - 原生数组、
JSON.parse('[]')、其他库返回的数组,全部不受影响
若真要补丁原生原型——加三重保险
极少数场景(如 polyfill 旧浏览器),必须扩展时,请同时满足:
-
存在性检查:
if (!Array.prototype.at) { Array.prototype.at = function(n) { /* ... */ }; } -
严格模式:确保脚本顶部有
'use strict';,防止静默失败 - 作用域隔离:将补丁包裹在 IIFE 或模块作用域中,避免泄漏到全局上下文


















