繁体   English   中英

Javascript-defineProperty与原型

[英]Javascript - defineProperty vs Prototype

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

虽然原型函数运行良好,但我发现,使用以下语法对(var x in y)的以下语法进行迭代时,我的函数名称显示为属性之一,破坏了我的逻辑。

由于进行了一些谷歌搜索,我重新定义了该函数(如下)。

我的问题是, Current块中的代码是扩展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
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM