正确的方法是使用Object.defineProperty
or Object.defineProperties
。在这种情况下,我将写下如何使用后者。*编辑:请注意,这不会像您期望的那样处理空数组。请参阅下面的编辑。
Object.defineProperties(Array.prototype, {
max: {
configurable: true,
enumerable: false,
value: function () {return Math.max(...this)},
writable: true
},
min: {
configurable: true,
enumerable: false,
value: function () {return Math.min(...this)},
writable: true
}
});
然后你可以这样做:
[4, 3, 2, 1].max() // 4
[4, 3, 2, 1].min() // 1
这将防止任何人陷入for in
陷阱,因为您将这些属性可枚举性设置为 false。
编辑。处理空数组
正如@MikeM 在他的评论中指出的那样,记录在案的行为和可能不是更有意义的——至少对我而言——。如果你不向这些函数发送参数,你会得到,在每种情况下都有不同的符号:Math.max()
Math.min()
Infinity
Math.max(); // -Infinity
Math.min(); // Infinity
因此,如果我们调用.max()
或调用的数组.min()
为空,我们将得到一个可以说是不那么合理的结果。为了处理这种边缘情况,解决方案是:
Object.defineProperties(Array.prototype, {
max: {
configurable: true,
enumerable: false,
value: function () {
if (this.length === 0) return null; // or whatever makes more sense
return Math.max(...this)
},
writable: true
},
min: {
configurable: true,
enumerable: false,
value: function () {
if (this.length === 0) return null;
return Math.min(...this)
},
writtable: true
}
});