我在尝试为模拟 .net (linq) 中可用功能的函数创建数组原型(prototype)时遇到了一个意想不到的问题,该函数名为 SingleOrDefault()。
虽然原型(prototype)函数工作正常,但我发现当使用以下语法遍历普通数组时 for (var x in y)... 我的函数名称显示为属性之一,打破我的逻辑。
经过一些谷歌搜索,我重新定义了函数(如下)。
我的问题是,Current block 中的代码是否是扩展 Array 对象而不会导致任何不良副作用的正确方法?
上一个
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
});
最佳答案
是的,您的“当前”代码是正确的,不像以前的代码那样受旧浏览器支持,如果您需要 ie6/7 支持,这是一个缺点(请参阅 https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/defineProperty)。
您可以将 object.hasOwnProperty 方法与“先前”代码一起使用,以在迭代时实现相同的效果:
for (var x in y) {
if (y.hasOwnProperty(y[x])) {
//would filter out SingleOrDefault in your examples above
}
}
关于Javascript - 定义属性与原型(prototype),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20518389/