Javascript - 定义属性与原型(prototype)

标签 javascript function prototype

我在尝试为模拟 .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/

相关文章:

javascript - 向构造函数或原型(prototype)添加属性之间的区别

javascript - 取出函数中的值(javascript)

python - 使用列表中其他值的函数过滤 python 中的列表。

javascript - 在创建带有属性的 JavaScript 对象时,为什么需要这段代码?

javascript - 从 CKEditor 中的样式菜单设置默认样式

javascript - 定义将由用户实现的功能

javascript - 高级 Javascript : Detecting whether current function is being called by a constructor

javascript - 根据复选框选中状态启用或禁用目标元素

javascript - 向页面添加新元素时出现 HTML ID 问题

javascript - jquery Accordion 动画没有方法