# no-extend-native
禁止扩展原生类型
在 JavaScript 中,您可以扩展任何对象,包括内置对象或 "native" 对象。有时人们会改变这些原生对象的行为,从而打破在代码的其他部分对它们所做的假设。
例如,这里我们覆盖了一个内置方法,该方法将影响所有对象,甚至是其他内置方法。
// 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"
}
避免这个问题的一个常见建议是用 users.hasOwnProperty(id)
包裹 for
循环的内部。但是,如果在整个代码库中严格执行此规则,则无需采取该步骤。
# 规则详情
不允许直接修改内置对象的原型。
此规则的错误代码示例:
/*eslint no-extend-native: "error"*/
Object.prototype.a = "a";
Object.defineProperty(Array.prototype, "times", { value: 999 });
# 选项
此规则接受 exceptions
选项,可用于指定允许扩展的内置列表。
# exceptions
示例 { "exceptions": ["Object"] }
选项的正确代码示例:
/*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';
# 何时不使用
当使用 polyfill 尝试使用最新规范修补旧版本的 JavaScript 时,您可能希望禁用此规则,例如以未来友好的方式可能会 Function.prototype.bind
或 Array.prototype.forEach
的那些。
← no-eval no-extra-bind →