Lance Pollard
Lance Pollard

Reputation: 79288

How do you check if a JavaScript object is directly an `{}` instance, not a subclass?

I have spent 10 or 20 minutes here and there probably a dozen times in the past year and never found a bulletproof answer to this question.

How do you check if a JavaScript object is an instance of Object, not a subclass?

One use case for this is to check if arguments[0] is an "options" hash vs. a "model" (MVC), both of which extend the native Object, but which should be treated differently.

I have tried these:

// some helper to get constructor name
function klassName(fn) {
  if (fn.__name__) {
    return fn.__name__;
  }
  if (fn.name) {
    return fn.name;
  }
  return fn.toString().match(/\W*function\s+([\w\$]+)\(/));
};

var Model = function() {};

m = new Model;
o = {};

Object(o) === o; // true
Object(m) === m; // true, thought it might be false

klassName(o.constructor); // Object
klassName(m.constructor); // Model

That klassName(m.constructor) doesn't work in some cases (can't remember exactly, but maybe a regex.constructor, something like that). Maybe it does, don't know for sure.

Is there a bulletproof way to tell if something is an {} object?

Upvotes: 13

Views: 2870

Answers (3)

user1532875
user1532875

Reputation: 1

I would just change one thing

var isObj = function(e){
    if(!e) return false; // change this line
    return e.toString() === '[object Object]';
};

Upvotes: 0

gnarf
gnarf

Reputation: 106352

Might something as simple as

function isObj( test ) {
    return test.constructor === Object;
}

Be what you are looking for?

Test in jsFiddle

Upvotes: 12

elclanrs
elclanrs

Reputation: 94101

You mean this? http://jsfiddle.net/elclanrs/ukEEw/

var o = {};
var re = /\d/;
var f = function(){};
var d = new Date();

var isObj = function(e){
    return e.toString() === '[object Object]';
};

console.log( isObj(o) ); // True
console.log( isObj(re) ); // False
console.log( isObj(f) ); // False
console.log( isObj(d) ); // False

Upvotes: 1

Related Questions