no-extend-native
禁止扩展原生类型
在 JavaScript 中,您可以扩展任何对象,包括内置或“原生”对象。有时,人们会以破坏其他代码部分对其做出的假设的方式更改这些原生对象的行为。
例如,这里我们正在覆盖一个内置方法,该方法将影响所有对象,甚至其他内置对象。
// seems harmless
Object.prototype.extra = 55;
// loop through some userIds
var users = {
"123": "Stan",
"456": "David"
};
// not what you'd expect
for (var id in users) {
console.log(id); // "123", "456", "extra"
}
避免此问题的常见建议是在 for
循环的内部使用 users.hasOwnProperty(id)
包装。但是,如果此规则在您的整个代码库中严格执行,则您无需执行此步骤。
规则详情
禁止直接修改内置对象的原型。
此规则的错误代码示例
在 Playground 中打开
/*eslint no-extend-native: "error"*/
;
;
选项
此规则接受一个 exceptions
选项,该选项可用于指定允许扩展的内置对象的列表。
exceptions
示例 { "exceptions": ["Object"] }
选项的正确代码
在 Playground 中打开
/*eslint no-extend-native: ["error", { "exceptions": ["Object"] }]*/
Object.prototype.a = "a";
已知限制
此规则不报告以下任何修改内置对象原型的不太明显的方法
var x = Object;
x.prototype.thing = a;
eval("Array.prototype.forEach = 'muhahaha'");
with(Array) {
prototype.thing = 'thing';
};
window.Function.prototype.bind = 'tight';
何时不使用它
当使用尝试用最新规范修补旧版 JavaScript 的 polyfill 时,您可能希望禁用此规则,例如那些可能以面向未来的方式在 Function.prototype.bind
或 Array.prototype.forEach
中执行操作的 polyfill。
相关规则
版本
此规则在 ESLint v0.1.4 中引入。