ホームページ >ウェブフロントエンド >jsチュートリアル >どのような状況では、JavaScript は Object.prototype に列挙可能なプロパティを追加すべきではありませんか?

どのような状況では、JavaScript は Object.prototype に列挙可能なプロパティを追加すべきではありませんか?

伊谢尔伦
伊谢尔伦オリジナル
2017-07-26 17:03:171462ブラウズ

決して列挙可能なプロパティを Object.prototype に追加しないでください

コードが Object 型のプロパティを反復処理するために for..in ループに依存している場合は、Object.prototype の列挙可能なプロパティを追加しないでください。

しかし、JavaScript 実行環境を強化する場合、Object.prototype オブジェクトに新しいプロパティやメソッドを追加することが必要になることがよくあります。たとえば、オブジェクト内のすべてのプロパティ名を取得するメソッドを追加できます:


Object.prototype.allKeys = function() { 
  var result = []; 
  for (var key in this) { 
    result.push(key); 
  } 
  return result; 
};

しかし、結果は次のようになります:


({ a: 1, b: 2, c: 3}).allKeys(); // ["allKeys", "a", "b","c"]

実現可能な解決策は、Object Define new の代わりに関数を使用することです。 .prototype のメソッド:


function allKeys(obj) { 
  var result = []; 
  for (var key in obj) { 
    result.push(key); 
  } 
  return result; 
}

ただし、本当に Object.prototype に新しいプロパティを追加する必要があり、そのプロパティを for..in ループ内で走査したくない場合は、ES5 Object.defineProject メソッドを使用できます。環境によって提供されます:


Object.defineProperty(Object.prototype, "allKeys", { 
  value: function() { 
    var result = []; 
    for (var key in this) { 
      result.push(key); 
    } 
    return result; 
  }, 
  writable: true, 
  enumerable: false, 
  configurable: true 
});

上記のコードの重要な部分は、enumerable 属性を false に設定することです。この場合、プロパティを for..in ループ内で走査することはできません。

以上がどのような状況では、JavaScript は Object.prototype に列挙可能なプロパティを追加すべきではありませんか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。