版本

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"
}

避免此問題的常見建議是使用 users.hasOwnProperty(id) 包裹 for 迴圈內部。但是,如果您的程式碼庫中嚴格執行此規則,則不需要執行此步驟。

規則詳細資訊

禁止直接修改內建物件的原型。

此規則的錯誤程式碼範例

在遊樂場中開啟
/*eslint no-extend-native: "error"*/

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

選項

此規則接受 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';

何時不使用

當您使用嘗試使用最新規格修補舊版 JavaScript 的 polyfill 時,您可能會想要停用此規則,例如那些可能會以未來友善的方式處理 Function.prototype.bindArray.prototype.forEach 的 polyfill。

版本

此規則在 ESLint v0.1.4 中引入。

資源

變更語言