我正潜入Mars Rover Kata。我遇到了一个有趣的问题。由于原型中的数组比较方法,我的茉莉花测试失败了。我正在使用数组比较方法来检测指定坐标或网格点处的障碍物。
作为一个例子,我的第一个测试产生了这个错误:预期[0,1,'N',未定义]等于[0,1,'N']。
当我在console.log中获取我的数组:[0,1,“N”,比较:功能]。这解释了为什么它不等于[0,1,'N']。
我的数组的长度是3,而 proto 有比较方法。我该怎么办这个问题?
更新
事实证明我的一个条件是返回undefined,这导致我的undefined错误被推入我的数组,但没有尝试@GameAlchemist解决方案我不会了解defineProperty或找出问题。
此外,根据我的阅读,在向内置原型添加属性以使用Object.defineProperty()和类似方法使它们不可枚举时,这是一种很好的做法。这将为您提供一些保护,防止破坏遗留代码中的for-in循环。
答案 0 :(得分:2)
您可以使用Object.defineProperty通过将其设置为不可枚举来隐藏原型属性/方法。
因此,如果您是定义比较的人,请执行以下操作:
Object.defineProperty(Array.prototype, 'compare', { value : compareFunction } );
由于默认情况下可配置,可枚举和可写是错误的,因此您将拥有只读,不可配置且不可枚举的属性:它不会妨碍您的比较。
如果您不是定义比较的那个,您必须希望它仍然是可配置的(使用Object.getOwnPropertyDescriptor查看或只测试以下代码):
Object.defineProperty(Array.prototype, 'compare', { value : Array.prototype.compare } );
以同样的方式,你可以对所有Array原型进行循环,以检查它自己的每个属性是否都是可枚举的,如果是,则将其设置为非枚举。
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));
答案 1 :(得分:0)
也许:
for(var i = 0, l=this.length; i < l; i++) {
if (this.hasOwnProperty(i)){
...
}
}