如何检查 JavaScript 对象是否直接是“{}”实例,而不是子类

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

本文关键字:子类 实例 检查 何检查 JavaScript 是否 对象      更新时间:2023-09-26

在过去的一年里,我在这里和那里花了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)在某些情况下不起作用(记不清了,但也许是正则表达式.constructor,类似的东西)。 也许是这样,不确定。

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

可能像

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

成为你要找的?

在 jsFiddle 中测试

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

我只会改变一件事

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