私は火星探査車カタに飛び込んでいます。私は興味深い問題に直面しています。プロトタイプの配列比較メソッドが原因で、ジャスミンテストが失敗します。配列比較メソッドを使用して、指定した座標またはグリッドポイントで障害物を検出しています。
例として、私の最初のテストでは次のエラーが発生します。[0、1、 'N'、undefined]が[0、1、 'N']に等しいと予想されます。
配列をconsole.logにすると、[0、1、 "N"、compare:function]が表示されます。これは、それが[0、1、 'N']と等しくない理由を説明しています。
私の配列の長さは3で、protoにはcompareメソッドがあります。この問題について何ができますか?
更新:
条件の1つがundefinedを返していたため、undefinedが配列にプッシュされるというエラーが発生していましたが、@ GameAlchemistソリューションを試さなければ、definePropertyについて学習したり、問題を理解したりすることはできませんでした。
さらに、私が読んだことから、組み込みのプロトタイプにプロパティを追加してObject.defineProperty()や同様のメソッドを使用し、それらを列挙できないようにすることをお勧めします。これにより、レガシーコードのfor-inループが壊れるのを防ぐことができます。
Object.definePropertyを使用して、プロトタイプのプロパティ/メソッドを列挙不可として設定することにより、非表示にすることができます。
したがって、比較を定義するのがあなたである場合は、次のようにします。
Object.defineProperty(Array.prototype, 'compare', { value : compareFunction } );
構成可能、列挙可能、および書き込み可能はデフォルトでfalseであるため、読み取り専用、構成不可能、および列挙不可能なプロパティがあります。これは、比較の邪魔になりません。
比較を定義しているのがあなたでない場合は、それがまだ構成可能であることを期待する必要があります(Object。getOwnPropertyDescriptorを参照するか、次のコードをテストしてください)。
Object.defineProperty(Array.prototype, 'compare', { value : Array.prototype.compare } );
同様に、すべての配列プロトタイプでループを実行して、それ自体のすべてのプロパティが列挙可能かどうかを確認し、列挙可能である場合は非列挙可能に設定できます。
http://jsbin.com/zunahebo/2/edit?js,console
Object.defineProperty(Array.prototype, 'compare', { value : compareArray } );
function compareArray(other) {
if (!other || other.length != this.length) return false;
for (var i=0; i<this.length; i++) if (this[i] !== other[i]) return false;
return true;
}
var a1 = [1, 2, 3, 4];
var a2 = [1, 2, 3, 4];
var a3 = [1, 2, 5, 6];
var a4 = [1, 2];
console.log(' a1 == a2 : ' + a1.compare(a2));
console.log(' a1 == a3 : ' + a1.compare(a3));
console.log(' a1 == a4 : ' + a1.compare(a4));
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加