javascript对象的tostring方法通过原型链查找:若自身未定义,则沿__proto__向上直至object.prototype.tostring;内置类型如array、date等重写了该方法以提供语义化字符串,而object.prototype.tostring.call()可绕过重写实现可靠类型检测。

JavaScript 中对象的 toString 方法是通过原型链向上查找并调用的:当一个对象自身没有定义 toString,JS 引擎会沿着它的 __proto__(即构造函数的 prototype)逐级向上查找,直到找到 Object.prototype.toString —— 这是所有普通对象最终继承的默认实现。
对象的原型链起点是 Object.prototype
几乎所有对象(除少数如 Object.create(null) 创建的“无原型”对象)的原型链终点都是 Object.prototype。这个原型对象上定义了 toString 方法:
-
{}.toString === Object.prototype.toString→true -
new Date().toString()先在Date.prototype上找,没找到就继续到Object.prototype -
Array.isArray([])不依赖toString,但[].toString()实际调用的是Array.prototype.toString(它被重写了,所以不走 Object 的)
内置类型通常重写了 toString
为提供更语义化的字符串表示,许多内置构造函数在自己的 prototype 上覆盖了 toString:
-
Array.prototype.toString:把数组元素用逗号拼接([1,2,3].toString() → "1,2,3") -
Date.prototype.toString:返回可读日期字符串(new Date().toString()) -
Number.prototype.toString(radix):支持进制转换((255).toString(16) → "ff") -
Function.prototype.toString:返回函数源码字符串
这些重写版本优先于 Object.prototype.toString 被调用,因为原型链查找总是从最近的原型开始。
Java开发手册规约集合,基于阿里巴巴Java开发手册(嵩山版)。 涵盖7大维度:编程规约、异常日志、单元测试、安全规约、MySQL数据库、工程结构、设计规约。 当用户需要:(1) 编写或审查Java代码 (2) 检查命名/代码规范 (3) 处理异常和日志 (4) 编写单元测试 (5) 安全编码 (6) 数据库设...
Object.prototype.toString 的特殊用途:类型检测
虽然多数对象调用 toString() 会得到“友好”结果,但 Object.prototype.toString.call(value) 是一种可靠的类型判断方式:
-
Object.prototype.toString.call([])→"[object Array]" -
Object.prototype.toString.call(null)→"[object Null]" -
Object.prototype.toString.call(new Set())→"[object Set]"
这是因为该方法内部读取的是对象的 内部属性 [[Class]](ES5)或 @@toStringTag(ES6+),不受自定义 toString 影响。
自定义对象如何控制 toString 行为
你可以直接在实例或原型上定义 toString,从而中断原型链查找:
- 实例上定义:
const obj = { toString() { return 'MyObj'; } };→ 调用obj.toString()不再访问原型 - 原型上定义:
function Cat() {} Cat.prototype.toString = function() { return `Cat ${this.name}`; }; - 若想复用原生行为再加工,可显式调用:
Object.prototype.toString.call(this)
只要对象(或其任意原型)拥有 toString 方法,就不会继续向上查找;一旦查到 Object.prototype.toString 就停止,它本身没有再向上委托。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










