`
zhouyrt
  • 浏览: 1161984 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

重写的isPlainObject方法

阅读更多

jq1.4中新增了个静态方法$.isPlainObject,见http://api.jquery.com/jquery.isPlainObject/ 。对于通过字面量定义的对象和new Object的对象返回true,new Object时传参数的返回false,如:

 

var p1 = new Object;
p1.name = 'tom';
var o1 = new Object('aa');

console.log($.isPlainObject({name:'Jack'})); //-> true
console.log($.isPlainObject(p1));	     //-> true
console.log($.isPlainObject('aa'));	     //-> false
console.log($.isPlainObject(o1));	     //-> false

 

$.isPlainObject(o1)返回也是false,见: 关于 new Object 时传参的一些细节

通过字面量定义的对象,其构造器是Object,很容易证明。

 

var obj = {};
console.log(obj.constructor === Object); //-> true

 

感觉1.4新加的这个方法用处不大,只能判断由Object构造器生成的对象(传参数时例外),甚至一度以为这只是在jq内部用而已,但偏偏公开了,挂在了$上。当自定义一个类(构造器),用$.isPlainObject判断new自定义类的对象时将返回false。

 

//自定义类(构造器),创建一个对象p
function Person(){this.name='jack'}
var p = new Person();

$.isPlainObject(p); //-> false
 

因此想写一个对于通过字面量定义及通过自定义类(构造器)创建的对象都返回true的方法。

 

function myIsPlainObject( obj ){
	return Object.prototype.toString.call(obj)==='[object Object]';
}
 

测试:

 

function Person(name){
	this.name=name;
}
var p = new Person('jack');
var o = {name:'tom'};

console.log(myIsPlainObject(p)); //-> true
console.log(myIsPlainObject(o)); //-> true
 

都返回true,一切貌似很顺利。偏偏IE中window/document/document.body/HTMLElement/HTMLCollection/NodeList/也返回true。
即IE中Object.prototype.toString.call以上对象返回的字符串也是'[object Object]',不知IE为何这样实现,Firefox/Chrome/Safari/Opera则不然。

修改下:

 

function myIsPlainObject( obj ){
	return 'isPrototypeOf' in obj && Object.prototype.toString.call(obj)==='[object Object]';
}

 

这里判断obj是否具有isPrototypeOf属性,isPrototypeOf是挂在Object.prototype上的。通过字面量或自定义类(构造器)创建的对象都会继承该属性方法,在有约定的情况下,这个方法可以使用。

 

console.log(myIsPlainObject(window));   //-> false
console.log(myIsPlainObject(document)); //-> false
 

但不遵守约定的情况下,仍然失败,如在window上人为的 添加isPrototypeOf属性

 

window.isPrototypeOf = '';
console.log(myIsPlainObject(window)); //-> true

 

 

最后可以参考cai兄的讨论:http://cmc3.cn/n/2010/05/01/156.html

 

 

分享到:
评论
1 楼 zhizhen23 2016-09-24  
LZ 提供的链接地址失效了

相关推荐

    jQuery.isPlainObject-v1.10.2源码

    jQuery.isPlainObject-v1.10.2源码

    超越Jquery_01_isPlainObject分析与重构

    ### 知识点:isPlainObject 方法分析 #### 1. jQuery 中的 isPlainObject 方法 - isPlainObject 是在 jQuery 1.4 版本中引入的一个方法,用于检测传入的对象是否是一个纯粹的对象。 - 所谓的“纯粹对象”主要是指...

    详解jQuery中的isPlainObject()使用方法

    这个方法的作用是为了跟其他的 JavaScript对象如 null,数组,宿主对象(documents),DOM 等作区分,因为这些用 typeof 都会返回object。 使用 语法: $.isPlainObject( object ) 参数说明: object:任意类型 ...

    is-what:JS类型检查(受TypeScript支持)功能,如`isPlainObject()isArray()`等。简单而小型的集成

    我正寻找: 一种检查任何类型(包括非原始类型)的简单方法能够检查对象是普通对象{}还是特殊对象(例如类实例) ! 让TypeScript在检查时自动知道值的类型那is-what ! (很棒的文字游戏 :grinning_face_with_big_...

    different-contexts-isPlainObject-test:测试具有不同全局上下文的构造函数instanceof构造函数问题

    在JavaScript编程中,`isPlainObject`是一个常用的方法,用于判断一个对象是否是"纯对象",也就是由`{}`或`new Object()`创建的对象。这个功能在处理数据验证、深度克隆等场景中十分常见。`instanceof`操作符则是...

    jquery 使用方法.docx

    - `.isPlainObject()`:确认参数是否为普通对象(非数组、DOM元素等)。 - `.support()`:检测浏览器对特定特性的支持情况。 8. **事件操作**:jQuery 的事件处理非常强大,可以使用 `.on()`, `.off()`, `....

    JQuery权威指南源代码

    使用$.isPlainObject()函数检测对象是否为原始对象 使用$.contains()函数检测两个节点是否包含 使用$.param()进行数组元素序列化 使用函数$.extend()扩展工具函数 使用函数$.proxy()改变事件函数的作用域 使用...

    jQuery编程中的一些核心方法简介

    类型检测是编程中常见的需求,jQuery 提供了 `jQuery.isArray()`、`jQuery.isPlainObject()` 和 `jQuery.isFunction()` 等方法,它们在类型检测方面比 JavaScript 原生的 `typeof` 操作符更为准确和强大。...

    2014-10-13-深入理解jQuery(3)——extend1

    这里使用了`jQuery.isPlainObject`检查是否为普通对象,`jQuery.isArray`检查是否为数组。如果是数组,`copyIsArray`标志被设置为`true`,然后创建一个新的空数组`clone`,用于存放源数组的拷贝。 对于数组的处理,...

    jquery-api

    jQuery还包含一系列实用工具方法,如`$.each()`用于遍历数组或对象,`$.inArray()`检查元素是否存在于数组中,`$.trim()`去除字符串两端的空白,`$.isPlainObject()`判断对象是否为纯对象等。 总结,jQuery API不仅...

    jquery1.8.3API

    8. **工具方法(Utility Methods)**:如`$.each()`用于迭代数组或对象,`$.extend()`合并对象,`$.trim()`去除字符串两端的空白,`$.isPlainObject()`检测是否为纯对象等。 9. **插件扩展(Plugins)**:jQuery的...

    JQuery each打印JS对象的方法

    - `$.isPlainObject(val)`:这个JQuery方法用于检测传入的值是否为一个纯粹的对象。纯粹的对象指的是通过 "{}" 或 "new Object" 创建的对象。 - `$.isArray(val)`:这个JQuery方法用于检测传入的值是否是一个数组。 ...

    jQuery中文参数手册 chm版

    9. **实用工具方法**:jQuery还提供了很多实用工具方法,如`$.trim()`, `.isPlainObject()`, `.type()`等,用于字符串处理、对象判断和类型检测。 10. **版本更新与兼容性**:jQuery 1.11.0是稳定版本,对老版本的...

    ReactComponent.js

    `isEmpty()`和`isPlainObject()`函数则帮助开发者更有效地处理数据结构。此外,fbjs还包含了`ExecutionEnvironment`模块,它提供了检测浏览器环境是否支持某些特性的能力,这对于编写跨平台的React应用尤为重要。 ...

    jquery中文操作手册 不好你P我

    9. **实用方法**:`$.trim()`去除字符串两端的空白,`$.isPlainObject()`检测是否为纯净的对象,`$.inArray()`检查元素是否存在于数组中。 10. **版本和兼容性**:jQuery有多个版本,如1.x、2.x和3.x,不同版本对IE...

    jQuery源码分析系列_1.6

    1. **isPlainObject()**:判断给定的对象是否是一个纯对象(没有原型链上的方法)。 2. **extend()**:深度合并两个或多个对象。 3. **each()**:遍历对象或数组,类似于`for`循环。 4. **map()**:对数组中的每个...

    jQuery高级程序设计目录1

    类型判断在jQuery中用于确定变量的类型,比如$.isPlainObject()检查是否为纯对象。仿队列接口用于管理异步操作,如$.queue(),确保操作按顺序执行。链式调用是jQuery的一大特色,通过返回自身来实现方法连续调用。 ...

Global site tag (gtag.js) - Google Analytics