Если вы используете ECMA 6 (например, в NodeJS или Newer tech tech), вы можете использовать следующую функцию, чтобы получить «имя класса».
// primitives
var array = [], obj = {}, str = "", date = new Date(),
num = 1, flt = 1.0, reg = new RegExp(/woohoo/g),
bool = true, myType = new MyType(), udf = undefined, nul = null;
// names of various types (primitive and not)
var names = cName(array) + ", " + cName(obj) + ", " + cName(str) + ", " +
cName(num) + ", " + cName(flt) + ", " + cName(reg) + ", " +
cName(bool) + ", " + cName(date) + ", " + cName(myType) + ", " +
cName(MyType) + ", " + cName(udf) + ", " + cName(nul);
// custom type
function MyType(){}
console.log(names);
// output:
// Array, Object, String, Number, Number, RegExp, Boolean, Date, MyType, MyType, undefined, null
// implementation
function cName(obj){
// default to non-null value.
var ret = '';
if(typeof obj === 'undefined') { ret = 'undefined'; }
else if(obj === null) { ret = String(obj); }
else if(typeof obj.constructor !== 'undefined' && obj.constructor !== null){
ret = obj.constructor.name
if(ret == 'Function') { ret = obj.name; }
}
return ret;
}
Хотя на самом деле нет «классов», это помогает, когда передается что-то вроде Array, vs Object, vs. Null
, и вы хотите знать, какой он есть.
, вызывающий typeof
на любом из них, будет возвращен 'object'
. Тогда есть предостережение от необходимости иметь дело с вещами вроде null
и undefined
.
Вызов Object.prototype.toString()
тяжелее, чем доступ к constructor.name
, поскольку нет никакого преобразования из какого-то типа в строку, и я считаю, что constructor
и constructor.name
являются переменными-членами, а не getter
, а это значит, никаких дополнительные функции не называется в ВОССТАНОВЛЕНИИ сказали имя ,
Такие вещи [документально] (https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/toString) [amply.] (Http: // www. ecma-international.org/ecma-262/5.1/#sec-15.2.4) – Pointy