array.prototypeに追加した関数と一緒にfor..inループを使用すると、for..inはそれらすべての関数もループします。
JavaScriptのfor / inステートメントは、オブジェクトのプロパティをループします
しかし、for..inでトリガーされずに配列プロトタイプに追加するにはどうすればよいですか?
コード例:
Array.prototype.sum = function (prop) {
// Do something
}
for (item in myArray) {
// Would actually loop myArray.length times + 1 for the 'sum'
}
for..inループを使用するライブラリを使用していますが、変更できません。
しかし、for..inでトリガーされずに配列プロトタイプに追加するにはどうすればよいですか?
を介して、列挙不可能なプロパティとして追加しObject.defineProperty
ます。列挙不可能がデフォルトであるため、次のようになります。
Object.defineProperty(Array.prototype, "sum", {
value: function() {
// ...implementation of sum
}
});
...しかし、明示的にしたい場合は、次のようにしますenumerable: false
。
Object.defineProperty(Array.prototype, "sum", {
enumerable: false, // <== Not necessary, false is the default
value: function() {
// ...implementation of sum
}
});
実例:
Object.defineProperty(Array.prototype, "sum", {
value: function() {
return this.reduce(function(acc, value) {
return acc + value;
}, 0);
}
});
var a = [1, 2, 3];
snippet.log("a.sum() = " + a.sum());
var key;
for (key in a) {
snippet.log("key = " + key);
}
snippet.log("Note that 'sum' did not show up as a key");
<!-- Script provides the `snippet` object, see http://meta.stackexchange.com/a/242144/134069 -->
<script src="http://tjcrowder.github.io/simple-snippets-console/snippet.js"></script>
最新のブラウザはすべてObject.defineProperty
、2009年にリリースされた第5版の仕様の一部であるをサポートしています。IE8は仕様よりも前のものであるため、サポートしていません。
補足:for-in
非エントリプロパティをArray.prototype
(または配列自体に)追加するかどうかに関係なく、を使用して配列をループすることはお勧めしません。この回答では、さまざまな選択肢をお勧めします。しかし、あなたはそれを実行し、必要なhasOwnProperty
チェックがなく(それは不十分に書かれたライブラリになります)、それを変更できないライブラリを使用していると言ったので、...上記はあなたがに追加する方法ですArray.prototype
に追加が表示されることはありませんfor-in
。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加