console.log用什么转换变量为字符串?如何获取目标字符串
问题解析与解决办法
为什么console.log能显示"restaurant",其他方法不行?
console.log处理对象的逻辑和String()、toString()完全不一样:
- 你用的
String(this)、this.toString()、${this}都是直接调用对象的toString()方法,显然你的Model类(或它继承的类)重写了这个方法,固定返回class extends Model {} JSON.stringify(this)返回undefined,说明这个实例要么有循环引用,要么内部有不可序列化的属性,或者被框架标记为不可转JSON- 而
console.log根本不会只依赖toString():它会直接读取对象的内部元信息(比如构造函数名称、实例标识),如果是Node.js环境会调用util.inspect(),浏览器控制台则有自己的渲染逻辑——比如框架(像Sequelize这类ORM的Model实例)会让控制台优先显示实例对应的模型名称(也就是你看到的"restaurant"),而不是原型的toString结果
怎么把"restaurant"存到变量里?
要拿到这个字符串,得先搞清楚它到底存在实例的哪个地方:
- 先在控制台直接打印
this,展开看所有属性(包括不可枚举的),找类似modelName、constructor.name、_name这类字段——比如Sequelize的模型实例就有modelName属性,直接对应你看到的名称 - 如果是Node.js环境,直接用
util.inspect(this),这就是console.log内部用的核心方法,拿到结果后可以提取"restaurant"部分 - 试试
this.constructor.name:如果你的模型类是class restaurant extends Model {},那构造函数的name属性就是类名,这大概率就是控制台显示的"restaurant" - 要是对象有自定义的
inspect方法(Node.js里是util.inspect.custom符号),直接调用this[util.inspect.custom]()也能拿到和console.log一致的输出
举个实际例子,如果是Sequelize模型,一行代码就能拿到:
const targetStr = this.modelName; // 或者 const targetStr = this.constructor.name;
额外说下console.log的字符串转换逻辑
console.log处理值的流程大概是:
- 原始类型(字符串、数字、布尔)直接输出值
- 对象类型先检查有没有自定义的
inspect方法,有就调用它拿显示内容 - 没有的话,就遍历对象的可枚举属性+原型链信息,整理成可读格式展示
- 完全不会强制依赖
toString(),所以能展示对象更真实的身份信息,而不是被重写后的统一字符串
内容的提问来源于stack exchange,提问作者Alk
相关产品推荐
相关产品推荐

