某日突发奇想,想实现数组类的remove方法。
具体效果呢就是
var a = ["a", "b", "c", "d", "e"];
a.remove(2); //按照下标删除,返回被删除的元素"c"
console.log(a); //打印["a", "b", "d", "e"]
上网搜了许久搜到了如何移除数组元素,以及向类添加方法
以下代码能够实现功能,但是有个弊端,在使用for (... in ...)遍历数组的时候会将remove枚举出来。
//向Array原型链添加remove方法
Array.prototype.remove = function(index) {
return this.splice(index,1)[0];
}
var arr = ["a", "b", "c", "d", "e"];
for (let item in arr) {
console.log(item); //打印元素下标
}
/*
执行后控制台打印:
1
2
3
4
5
remove
*/
恰逢学习vue,(b站某网课)老师讲解vue数据劫持,举了个数据劫持的例子,可以用Object.defineProperty向对象动态添加属性,还能配置属性是否能被枚举/修改/删除
// 定义对象
let person = {
name: "张三",
sex: "男",
}
// 定义变量
let number = 22
Object.defineProperty(person, 'age', {
//value: 18, //定义age属性的值
enumerable: true, //定义age属性能否被枚举
//writable: true, //定义age属性能否被修改
configurable: true, //定义age属性能否被删除
get(){ //定义age属性getter
return number;
},
set(value){ //定义age属性setter
console.log("赋值" + value);
number = value;
},
//注意:不能同时有访问器(getter/setter) 与 value/writable 属性。
})
经过整合,最终得到了如下代码(其他三个是顺手写的)
//移除数组中指定下标的元素,返回被删除的值(会修改原数组)
Object.defineProperty(Array.prototype, 'remove', {
value: function(index) {
return this.splice(index,1)[0];
},
enumerable: false,
writable: false,
configurable: true,
});
//替换字符串所有中指定值(不会修改原字符串)
Object.defineProperty(String.prototype, 'replaceAll', {
value: function(searchValue, replaceValue) {
return this.split(searchValue).join(replaceValue);
},
enumerable: false,
writable: false,
configurable: true,
});
//对字符串进行base64编码(不会修改原字符串)
Object.defineProperty(String.prototype, 'base64', {
value: function(searchValue, replaceValue) {
return btoa(unescape(encodeURIComponent(this)));
},
enumerable: false,
writable: false,
configurable: true,
});
//对字符串进行base64解码(不会修改原字符串)
Object.defineProperty(String.prototype, 'debase64', {
value: function(searchValue, replaceValue) {
return decodeURIComponent(escape(atob(this)));
},
enumerable: false,
writable: false,
configurable: true,
});