如何确定一个对象是否是 Javascript 中的对象字面量?

新手上路,请多包涵

有什么方法可以在 Javascript 中确定对象是使用 对象文字 表示法还是使用构造函数方法创建的?

在我看来,您只是访问它的父对象,但如果您传入的对象没有对其父对象的引用,我认为您无法分辨,对吗?

原文由 leeand00 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 413
2 个回答

我刚刚在一次甜蜜的 hackfest 中遇到了这个问题和线程,该 hackfest 涉及评估对象是使用 {} 还是 new Object() 创建的圣杯(我仍然没有弄清楚。)

无论如何,我惊讶地发现此处发布的 isObjectLiteral() 函数与我自己为 Pollen.JS 项目编写的 isObjLiteral() 函数之间存在相似之处。我相信这个解决方案是在我提交 Pollen.JS 之前发布的,所以 - 向你致敬!我的优点是长度……不到一半(如果包括您的设置程序),但两者都会产生相同的结果。

看一看:

函数 isObjLiteral(_obj) {
  var _test = _obj;
  返回( typeof _obj !== 'object' || _obj === null ?
              错误的 :
              (
                (功能 () {
                  而(!假){
                    如果 ( Object.getPrototypeOf( _test = Object.getPrototypeOf(_test) ) === null) {
                      休息;
                    }
                  }
                  返回 Object.getPrototypeOf(_obj) === _test;
                })()
              )
          );
}

此外,一些测试内容:

var _cases={
    _objLit:{},
    _objNew : 新对象(),
    _函数:新函数(),
    _array:新数组(),
    _string:新的字符串(),
    _图像:新图像(),
    _bool:真
};

console.dir(_cases);

for ( var _test in _cases ) {
  控制台组(_test);
  控制台目录({
    类型:typeof_cases[_test],
    字符串:_cases[_test].toString(),
    结果:isObjLiteral(_cases[_test])
  });
  console.groupEnd();
}

或者在 jsbin.com 上…

http://jsbin.com/iwuwa

当你到达那里时一定要打开 firebug - 调试文档是为 IE 爱好者准备的。

原文由 Rick 发布,翻译遵循 CC BY-SA 2.5 许可协议

你想要的是:

 Object.getPrototypeOf(obj) === Object.prototype

这将检查该对象是否是使用 new Object(){...} 创建的普通对象,而不是 Object 的某个子类。

原文由 Jesse 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题