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

伊谢尔伦
リリース: 2017-07-26 17:03:17
オリジナル
1432 人が閲覧しました

決して列挙可能なプロパティを 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 サイトの他の関連記事を参照してください。

関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート