一年多前用nuxt2.0写的给儿子认字用的项目《阿洛识字》,一直正常运行。但最近重新下载依赖后不能正常运行了。回退到前面正常的版本,重新安装依赖,仍然不行,看了看package-lock.json也和以前版本相同。
查找不能正常运行的原因,发现是我加载Number原型上的自定义方法被调用时,this变化了,以前是数字,现在变成了一个数字包装的对象。而在这里判断数字时用了typeof,经尝试,改为instanceof判断是否是目标的实例,即可解决问题。
/**
* 随机取出一个字符或元素
* @param n 随机取出n个元素
* @returns {*}
*/
const rdm = function (n) {
let temp = '';
// 比如n为5,则temp最终是'012345'
// if(typeof this === 'number' ){ // 这是以前的写法,若数字调用,则this变成了包装对象
if(this instanceof Number){ // 重点:这样写没问题
for(let i = 0; i<=this; i++){
temp += i;
}
}else{
temp = this;
}
if(n){
return temp.disruptOrder().slice(0, n) // disruptOrder是个打乱顺序的方法
}else{
return temp[Math.random() * temp.length | 0]
}
};
Array.prototype.rdm = rdm;
String.prototype.rdm = rdm;
Number.prototype.rdm = rdm;