web-dev-qa-db-ja.com

配列プロトタイプは読み取り専用です。プロパティを追加しないでください拡張なしネイティブ

だから基本的に私はこのコードを持っています:

Array.prototype.inState = function (needle, haystack) {
  let index = this.findIndex(value => value[needle] === haystack);

  return index === -1;
};

そして、与えられた針が反応状態にあるかどうかをチェックするのに十分に機能します。しかし、ESlintは次のように言っています。

Array prototype is read only, properties should not be added  no-extend-native

だから私の質問は:私のコードの何が問題になっていますか?

13
AH.Pooladvand

EsLint Docsから:

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

つまり、Array.prototype.inStatearray.prototypeを拡張するため、配列を使用する場合は常に、instate関数もその配列に追加されます。

したがって、あなたの場合、この例は配列に適用されます。

Array.prototype.inState = function (needle, haystack) {
  let index = this.findIndex(value => value[needle] === haystack);

  return index === -1;
};


// loop through some userIds
var users = [{"123": "Stan"},{"456": "David"}];

// not what you'd expect
for (var id in users) {
    console.log(users[id]); // "123", "456", "extra"
}

回避策


この行を追加して警告を無視できます。

/*eslint no-extend-native: ["error", { "exceptions": ["Object"] }]*/ to ignore that warning.

参照: https://eslint.org/docs/rules/no-extend-native

7
Just code

これは、esLintがネイティブのprotoTypesチェーンに変更を加えるためです。あなたは付け加えられます // eslint-disable-next-line no-extend-native行の上で問題ありません。

4
Ashif Zafar