首页
学习
活动
专区
圈层
工具
发布

Prototype
EN

Stack Overflow用户
提问于 2013-12-11 11:51:05
回答 1查看 703关注 0票数 2

在试图为一个模拟.net (linq)中可用的称为SingleOrDefault()的函数创建数组原型时,我遇到了一个意外的问题。

虽然原型函数工作得很好,但我发现当使用(var X in Y)的语法迭代一个普通数组时.我的函数名作为属性之一出现,破坏了我的逻辑。

由于googling,我重新定义了函数(如下所示)。

我的问题是,当前块中的代码是否是正确的方式来扩展数组对象而不造成任何不必要的副作用?

以前的

代码语言:javascript
复制
Array.prototype.singleOrDefault = function (predicate) {
    var items = applyPredicate(this, predicate);
    if (items.length > 1) {
        throw new Error(errorOutput.multipleElements);
    }
    return (items) ? items[0] : null;
};

电流

代码语言:javascript
复制
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
});
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-12-11 12:04:22

是的,您的“当前”代码是正确的,不像前面的代码那样被旧的浏览器所支持,如果您需要ie6/7支持,这是一个缺点(请参阅Objects/Object/defineProperty)。

在迭代时,可以使用object.hasOwnProperty方法和“上一段”代码实现相同的效果:

代码语言:javascript
复制
for (var x in y) {
     if (y.hasOwnProperty(y[x])) {
        //would filter out SingleOrDefault in your examples above
    }
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20518389

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档