How to get a JavaScript object's class?
If you're in a hurry, here is the tl;dr: You can obtain an object's class in JavaScript using the yourObject.constructor.name property or the Object.prototype.toString.call(yourObject) method.
Both methods are especially useful for custom objects, but be wary that minification can modify constructor names. Use .constructor.name if you prefer readability and Object.prototype.toString for greater robustness.
Potholes in the rosy road
While constructor.name and Object.prototype.toString methods might seem like a walk in the park, beware of the raining clouds in the form of edge cases:
- Minification tools such as UglifyJS can change function names, leaving your code without an umbrella. Enable
--mangle falseto keep them dry. - Anonymous functions or variables don't leave traces. It's like playing hide-and-seek with your function names.
- Objects created in different environments like iframes can pretend to be someone else when you use
constructor.name. constructor.namereturns "undefined" for objects without a prototype, something like impersonating a ghost.
Don't get caught in the rain! Here's how to handle these situations:
- Use function identities instead of relying on
.nameif you're commuting through minification. - Direct constructor comparison works better than checking
name, don't always judge a function by its name. Function.prototype.toString()with regex can extract function names. It might feel like squinting through the fog, but it gets the job done.
Digging into the object skeleton
Get friendly with the prototype chain
The instanceof operator is like a family tree. You can trace an object's lineage and check if it is a prodigal son turned instance of a specific class or constructor.
Class-based creation vs the OG constructor functions
JavaScript is a land of opportunities. You can create objects using constructor functions or the hip class syntax from ES6. The cool thing is our methods work on both. But hey, keep it on the DL and watch for browser support if you're going class style.
Dealing with oddballs
Dealing with native types
When dealing with native types like String, Number, or the socially distant Null and Undefined, use a custom getNativeClass function:
This antiseptic method ensures a clear identification rightly suited for a prim and proper JavaScript type.
Inheritance issues
For those working with inheritance, remember to hit the gym and strengthen the constructor references. That way, instance.constructor.name won’t break a sweat producing the accurate class name.
Cross-environment objects
For objects living out of the local context scope (like frames, web workers), using instance.constructor.name can be like expecting a friendly neighbor. Stick with a faithful friend like Object.prototype.toString or instanceof when predicting behaviour.
Was this article helpful?