应在自有构造函数或类的 prototype 上添加方法,避免污染 Object.prototype 等顶层原型;命名避开原生属性名,可用 Object.defineProperty 控制可枚举性;ES6 class 更安全;动态键名须严格校验过滤。

在原型对象上写方法本身不会污染全局,真正危险的是把方法或数据直接挂到 Object.prototype 或 Array.prototype 这类“顶层祖先”上——这会让所有对象都意外继承它,引发不可控的副作用。正确做法是只在**自己定义的构造函数或类的 prototype 上添加方法**,并避开敏感属性名。
只在自有构造函数的 prototype 上扩展
这是最安全、最常规的方式。你创建的类或构造函数,它的 prototype 是专属的,不影响其他对象:
- ✅ 正确示例:
function User(name) { this.name = name; }
User.prototype.greet = function() { return `Hello, ${this.name}`; };
const u = new User('Alice');
console.log(u.greet()); // "Hello, Alice" - ❌ 危险示例:
Object.prototype.myLog = function() { console.log(this); }; // 所有对象({}、[]、new Date())都会多一个 myLog 方法,极易冲突
避免使用可能被遍历或覆盖的属性名
即使在自有 prototype 上,也要避开 constructor、toString、valueOf、hasOwnProperty 等原生方法名,否则可能破坏内置行为或被 for...in 遍历到:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- ✅ 推荐命名:用前缀或语义明确的词,如
userFormatName、isValidEmail - ✅ 使用
Object.defineProperty控制可枚举性:
User.prototype.setRole = function(role) { this.role = role; };
Object.defineProperty(User.prototype, 'setRole', { enumerable: false });(这样for...in不会暴露它)
ES6 类语法更清晰,天然规避误操作
用 class 定义的方法默认只存在于该类的 prototype 上,且语法强制封装,不易手滑污染顶层:
立即学习“Java免费学习笔记(深入)”;
- class ApiClient {
constructor(base) { this.base = base; }
fetch(path) { return fetch(this.base + path); }
}
// fetch 方法只在 ApiClient.prototype 上,不会影响 Object 或其他类 - 注意:不要在 class 内部直接给
ApiClient.prototype赋值,那反而容易出错;所有方法都应写在 class 块内或用static明确标识
警惕动态赋值导致的原型链污染
如果方法名或键名来自用户输入、配置或 JSON 数据,必须校验和过滤,防止通过 obj.__proto__.xxx 或 obj.constructor.prototype.xxx 注入:
- ❌ 危险写法:
const key = userInput; // 如输入 "__proto__"
obj[key] = value; // 可能污染原型 - ✅ 安全做法:
只允许白名单属性名;用Object.hasOwn(obj, key)判断是否为自有属性;对不确定来源的 key 做字符串清洗(如去掉点号、中括号、下划线开头等)

















