12

在过去的一年里,我在这里和那里花了 10 或 20 分钟可能有十几次,但从未找到这个问题的万无一失的答案。

如何检查 JavaScript 对象是否是 的实例Object,而不是子类?

一个用例是检查是否arguments[0]是“选项”哈希与“模型”(MVC),两者都扩展了 native 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,类似的东西)。也许确实如此,不确定。

有没有一种防弹的方法来判断某物是否是{}物体?

4

3 回答 3

11

可能像这样简单

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

成为你正在寻找的东西?

在 jsFiddle 中测试

于 2012-04-25T23:41:53.503 回答
1

你是这个意思?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

​</p>

于 2012-04-25T23:14:37.370 回答
0

我只想改变一件事

var isObj = function(e){
    if(!e) return false; // change this line
    return e.toString() === '[object Object]';
};
于 2012-08-03T21:32:07.213 回答