修改Chrome中alert()的对象输出生效,数组无效,该调整什么?
问题解答
普通对象alert输出格式的来源
用alert()输出普通对象时,底层会调用Object.prototype.toString()方法,这个方法的硬编码逻辑就是返回[object 类型标识]的格式——外层的[object ]是固定写法,中间的标识默认是对象内部的[[Class]]属性值(普通对象的[[Class]]就是Object)。你通过给Object.prototype添加Symbol.toStringTag自定义getter,本质是让toString()方法优先使用这个Symbol的值作为中间的类型标识,所以会变成[object MyReplacement],但外层的括号和object前缀是该方法的固定输出,无法修改。
修改数组alert输出的方法
数组的alert()输出逻辑和普通对象不同:alert在转换数组为字符串时,调用的是Array.prototype.toString(),而非Object.prototype.toString()。数组自带的toString()方法默认会调用join(','),把元素用逗号拼接成字符串,所以修改Array.prototype[Symbol.toStringTag]不会生效——因为根本没用到这个逻辑。
要修改数组的alert输出,直接重写Array.prototype.toString()即可,示例如下:
// 自定义输出格式 Array.prototype.toString = function() { return `[自定义数组: ${this.join('|')}]`; }; alert([1,2,3]); // 输出 [自定义数组: 1|2|3]
如果想让数组输出和自定义对象类似的[object XXX]格式,可让数组的toString调用Object的toString方法,同时搭配自定义Symbol.toStringTag:
Array.prototype[Symbol.toStringTag] = 'MySpecialArray'; Array.prototype.toString = function() { return Object.prototype.toString.call(this); }; alert([1,2,3]); // 输出 [object MySpecialArray]
内容的提问来源于stack exchange,提问作者obscure
相关产品推荐
相关产品推荐

