版本

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"*/

Object.prototype.a = "a";
Object.defineProperty(Array.prototype, "times", { value: 999 });

选项

此规则接受 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.bindArray.prototype.forEach 的 polyfill。

版本

此规则在 ESLint v0.1.4 中引入。

资源

更改语言