在试图为一个模拟.net (linq)中可用的称为SingleOrDefault()的函数创建数组原型时,我遇到了一个意外的问题。
虽然原型函数工作得很好,但我发现当使用(var X in Y)的语法迭代一个普通数组时.我的函数名作为属性之一出现,破坏了我的逻辑。
由于googling,我重新定义了函数(如下所示)。
我的问题是,当前块中的代码是否是正确的方式来扩展数组对象而不造成任何不必要的副作用?
以前的
Array.prototype.singleOrDefault = function (predicate) {
var items = applyPredicate(this, predicate);
if (items.length > 1) {
throw new Error(errorOutput.multipleElements);
}
return (items) ? items[0] : null;
};电流
Object.defineProperty(Array.prototype, 'singleOrDefault', {
value: function (predicate) {
var items = applyPredicate(this, predicate);
if (items.length > 1) {
throw new Error(errorOutput.multipleElements);
}
return (items) ? items[0] : null;
},
enumerable: false
});发布于 2013-12-11 12:04:22
是的,您的“当前”代码是正确的,不像前面的代码那样被旧的浏览器所支持,如果您需要ie6/7支持,这是一个缺点(请参阅Objects/Object/defineProperty)。
在迭代时,可以使用object.hasOwnProperty方法和“上一段”代码实现相同的效果:
for (var x in y) {
if (y.hasOwnProperty(y[x])) {
//would filter out SingleOrDefault in your examples above
}
}https://stackoverflow.com/questions/20518389
复制相似问题