[英]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.