,检测是否是当前 class,不是则报错
2-7. constructor
/**
* X是否为type类型
* @author AJ
* @param {Any} X
* @param {String} type
* @returns {Boolean}
*/
const isXType = (X, type) => X.constructor.toString().indexOf(type) > -1
3(1) Object.prototype.toString.call(val)方法
3(2) Reflect.apply(Object.prototype.toString, val, [])方法
3-0. 前言
Object.prototype.toString.call(val)方法的本质是 将参数转换为字符串。
String(val)强制类型转换的本质 同上。但 二者存在差异。String(val)会依次调用 val.toString()、val.valueOf(),若 val 或 val.prototype 改写这两个方法,则二者结果可能会不相等。
深入思考:Object.toString()不行吗?为什么要加上 call()? 简单回答:Object.toString()返回方法,Object.prototype.toString()返回值类型。Array、Function 等基于 Object 创建,但继承的是 Object.toString(),不是 Object.prototype.toString()。
Object.prototype.toString() 返回'[object XXX]'。 String,Number,Boolean,Symbol,BigInt 调用的 toString()方法,就是来自 Object.prototype。null,undefined 调用 toString()会报错。如下
Math.toString() // "[object Math]"
Array.toString() // "function Array() { [native code] }"
new Object().toString() // "[object Object]"
但是,大多数对象的 toString()方法都是重写了的。所以需要 call 调用原型链上的原生 toString()去使用,或者是 Reflect。call()重写如下:
没有重写 toString()的内置对象:JSON,Math,Atomics。 直接调用这三者的 toString()可以得到 '[object XXX]'
const aj = {
toString() {
return 'AJ'
},
aj.toString() // 'AJ'
Object.prototype.toString.call(x) // '[object Object]'
Reflect.apply(Object.prototype.toString, aj, []) // "[object Object]"
JSON.toString() // "[object JSON]"
Math.toString() // "[object Math]"
Atomics.toString() // "[object Atomics]"
所以 Object 自身也可以有 toString()方法。Object.String()返回方法,Object.prototype.toString()返回值类型。
突然还联想到一个知识点,内置函数 和 自定义函数 的表现是不一样的:
内置函数 会返回 [n