给数组原型对象添加方法
今天使用for...in
方法的时候发现枚举到了意料之外的prototype
内的方法,发现是没有正确为数组原型对象添加方法,在此记录。
问题
一般我们如何给一个数组原型对象添加方法呢,比如我们添加一个去重方法。
1 | Array.prototype.unique = function () { |
我看不少文章里这样就好了,这就会出现我刚刚说到的问题。在你使用for...in
方法遍历数组时就会拿到unique
这个 key 值,这个是不符合我们预期的。
其实出现这样的情况是因为Array.prototype
对象的unique
属性的描述值enumerable
为true
,也就是可枚举,在枚举对象属性时会被枚举到(for...in
或Object.keys
方法)。
根据MDN Web Docs说明,可枚举属性是指那些内部 可枚举
标志设置为 true
的属性,对于通过直接的赋值和属性初始化的属性,该标识值默认为即为 true
,对于通过 Object.defineProperty
等定义的属性,该标识值默认为 false
。可枚举的属性可以通过 for...in
循环进行遍历(除非该属性名是一个 Symbol
)。
解决
正确的方法如下,忽略方法内容。
方法一
先添加方法,再通过 Object.defineProperty
设置为不可枚举。
1 | Array.prototype.unique = function () {}; |
方法二
或者直接通过 Object.defineProperty
方法添加。此时enumerable
默认为false
,不用特别指定。
1 | Object.defineProperty(Array.prototype, "unique", { |