JavaScriptでどのオブジェクトがis complicatedであるかを特定し、どのオブジェクトが配列であるかを調べるには、hacky solutionの何かがあります。幸いなことに、それは以下の例の両方で動作するように管理します。Object.createで作成されたオブジェクトがJavaScriptでArrayから継承されているかどうかを確認することはできますか?
Object.prototype.toString.call([]); // [object Array]
Object.prototype.toString.call(new Array()); // [object Array]
グレート、見えない[object Object]
!悲しいことに、この方法はこれでも失敗することがあります。
var arr = Object.create(Array.prototype);
Object.prototype.toString.call(arr); // [object Object]
これは不快です。私のarr
オブジェクトには配列のすべてのメソッドがあり、配列のように機能し、すべての目的で配列はです。しかし、JavaScriptはそれを識別するためのツールを提供していません。
オブジェクトが特定のプロトタイプから継承するかどうかを判断する方法はありますか?私はあなたがそうのようなプロトタイプを反復処理できたとします
function inherits(obj, proto) {
while (obj != null) {
if (obj == proto) return true;
obj = Object.getPrototypeOf(obj);
}
return false;
}
inherits(Object.create(Array.prototype), Array.prototype); // true
しかし、それはハック少しを感じています。よりクリーンなアプローチはありますか?
私はちょうど好奇心が強い:なぜあなたは今までこのような配列を作成しますか? 'Object.create(Array.prototyp);' 'Object.prototype.toString.call(arr);で確認してください。 – Zim84
@ Zim84:これは単なる例です。実際のアプリケーションでは、決してこれを行うべきではありません。実際のアプリケーションでは、Object.create(Array.prototype)が別の場所で呼び出され、作成されたオブジェクトを別の関数に渡すことがあります –
問題は本当に本当の配列を持たないことです(例えば、一見するとそのように見えるものだけ)。あなたが持っているのは配列のようなもので、真の配列のすべてのメソッドを持っています。 array-likesをチェックしたいのであれば、基本的に 'length'プロパティを持っていて文字列ではないかどうか確認するだけです。それは最高のIMOです。真の配列をチェックするには、 'Object.prototype.toString.call'または' Array.isArray'を使い、 'Array.prototype'のプロトタイプを持つオブジェクトが真の配列であるとは限りません。 –