扩展方法是一个很有趣的东西。
使用prototype在原始的类型上添加自己需要的方法。方便在一些常用的情况下使用,比如说字符串的String.trim()清除字符串前后的空格(当然这个方法内置已经有了)
举个数组的例子。
Array.push() -- 推入一个数据。
假如我希望推入的数据不重复呢。要么在调用的时候进行数据遍历是否重复再推入,但这样略显麻烦以及重复。
1 Array.prototype.pushWithoutDuplicate = function () { 2 for (let i = 0; i < arguments.length; i++) { 3 const arg = arguments[i] 4 // this表示调用的数组 5 if (this.indexOf(arg) === -1) { 6 this.push(arg) 7 } 8 } 9 } 10 11 // 这样的话 12 let a = [1, 2, 3] 13 a.pushWithoutDuplicate(4) //成功 a = [1, 2, 3, 4] 14 a.pushWithoutDuplicate(3) // 无反应
这样好像感觉有点蠢,毕竟我肯定知道3是重复的。
但实际情况,比如我开发一个随机抽奖,但实际上,奖项可能不能被同一个人拿到(踩狗屎运那种),所以这种情况往往很有用
1 const peoples = ['老王', '小白', '凑热闹的'] 2 const prizeNum = 2 3 let prizeResult = [] 4 5 function randomResult () { 6 // 当获奖者小于2 7 while (prizeResult.length < prizeNum) { 8 // 随机产生一个获奖者 9 prizeResult.push(peoples[Math.floor(Math.random() * 2)]) 10 // 收不定老王很幸运,全包了,那怎办 11 } 12 } 13 14 15 // 这种情况就不会发生了 16 function randomResultTwo () { 17 // 当获奖者小于2 18 while (prizeResult.length < prizeNum) { 19 // 随机产生一个获奖者 20 prizeResult.pushWithoutDuplicate(peoples[Math.floor(Math.random() * 2)]) 21 } 22 }
ES6中Set的数据结构,也可以达到上述的效果。
Set类似于数据,但是成员的值都是唯一的。
1 const s = new Set(); 2 3 [2, 3, 5, 4, 5, 2, 2].forEach(x => s.add(x)); 4 5 for (let i of s) { 6 console.log(i); 7 } 8 // 2 3 5 4
或者直接
array = [...new Set(array)] // 一步到位