Подтвердить что ты не робот

Как вы проверяете, является ли объект JavaScript непосредственно экземпляром `{}`, а не подклассом?

Я провел 10 или 20 минут здесь и там, вероятно, дюжину раз в прошлом году и так и не нашел пуленепробиваемого ответа на этот вопрос.

Как вы проверяете, является ли объект JavaScript экземпляром Object, а не подклассом?

Одним из вариантов использования является проверка того, является ли arguments[0] хешем "опций" и "модель" (MVC), оба из которых расширяют собственный Object, но с ним следует обращаться по-разному.

Я пробовал эти:

// 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

То, что klassName(m.constructor) не работает в некоторых случаях (точно не помню, но может быть, regex.constructor, что-то вроде этого). Возможно, это так, не знаю точно.

Есть ли пуленепробиваемый способ узнать, является ли что-то объектом {}?

4b9b3361

Ответ 1

Возможно, что-то простое, как

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

Будь то, что ищешь?

Тест в jsFiddle

Ответ 2

Ты имеешь в виду это? 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

Ответ 3

Я бы просто изменил одну вещь

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