logo头像

求知若渴,虚心若愚

jQuery - jQuery源码学习 - jQuery扩展工具方法源码分析(二)

type()

  • 确定JavaScript内置对象的类型
  • 返回小写形式的类型名称
  • 如果对象是undefined或null,则返回相应的”undefined”或”null”
1
2
3
4
5
6
7
8
9
10

type: function( obj ) {
if ( obj == null ) {
return String( obj );
}
// Support: Safari <= 5.1 (functionish RegExp)
return typeof obj === "object" || typeof obj === "function" ?
class2type[ core_toString.call(obj) ] || "object" :
typeof obj;
},
  • 如果参数obj是undefined或null,通过String( obj )转换为对应的原始字符串“undefined”或“null”
  • 如果参数是JavaScript内部对象,则返回对应的字符串名称;其他情况一律返回“object”。

    • 先借用Object的原型方法toString()获取obj的字符串表示,返回值的形式为[object class],其中的class是内部对象类,
    • 例如,Object.prototype.toString.call( true )会返回[object Boolean];
    • 然后从对象class2type中取出[object class]对应的小写字符串并返回;如果未取到则一律返回“object”。
  • 对象class2type初始化后的结构为:

1
2
3
4
5
6
7
8
9
10
11

{
"[object Array]": "array"
"[object Boolean]": "boolean"
"[object Date]": "date"
"[object Function]": "function"
"[object Number]": "number"
"[object Object]": "object"
"[object RegExp]": "regexp"
"[object String]": "string"
}
1
2
3
4
5
6
7
8

$.type( undefined ) === "undefined"

$.type() === "undefined"

$.type( window.notDefined ) === "undefined"

$.type( null ) === "null"
  • 如果对象有一个内部属性[[Class]]和一个浏览器的内置对象的 [[Class]] 相同,我们返回相应的 [[Class]] 名字
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16

$.type( true ) === "boolean"

$.type( 3 ) === "number"

$.type( "test" ) === "string"

$.type( function(){} ) === "function"

$.type( [] ) === "array"

$.type( new Date() ) === "date"

$.type( new Error() ) === "error" // jQuery 1.9 新增支持

$.type( /test/ ) === "regexp"

isPlainObject()

  • 判断指定参数是否是一个纯粹的对象
  • 即是否是用对象直接量{}或new Object()创建的对象
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18

isPlainObject: function( obj ) {

if ( jQuery.type( obj ) !== "object" || obj.nodeType || jQuery.isWindow( obj ) ) {
return false;
}

try {
if ( obj.constructor &&
!core_hasOwn.call( obj.constructor.prototype, "isPrototypeOf" ) ) {
return false;
}
} catch ( e ) {
return false;
}

return true;
},
  • 如果参数obj满足以下条件之一,则返回false

    • Object.prototype.toString.call( obj )返回的不是[object Object]
    • 参数obj是DOM元素
    • 参数obj是window对象
    • 如果参数obj不满足以上所有条件,则至少可以确定参数obj是对象
  • 检查对象obj是否由构造函数Object()创建。如果对象obj满足以下所有条件,则认为不是由构造函数Object()创建,而是由自定义构造函数创建,返回false

    • 对象obj含有属性constructor。
      • 由构造函数创建的对象都有一个constructor属性,默认引用了该对象的构造函数。如果对象obj没有属性constructor,则说明该对象必然是通过对象字面量{}创建的。
    • 对象obj的属性constructor是非继承属性。
      • 默认情况下,属性constructor继承自构造函数的原型对象。如果属性constructor是非继承属性,说明该属性已经在自定义构造函数中被覆盖。
    • 对象obj的原型对象中没有属性isPrototypeOf。
      • 属性isPrototypeOf是Object原型对象的特有属性,如果对象obj的原型对象中没有,说明不是由构造函数Object()创建,而是由自定义构造函数创建。
    • 函数hasOwn()指向Object.prototype.hasOwnProperty( property ),用于检查对象是否含有执行名称的非继承属性

TIP
在IE 8/9中,在某些浏览器对象上执行以上检测时会抛出异常,也应该返回false。

isEmptyObject

  • isEmptyObject() 函数用于检查对象是否为空(不包含任何属性)
1
2
3
4
5
6
7
8

isEmptyObject: function( obj ) {
var name;
for ( name in obj ) {
return false;
}
return true;
},
  • for-in 循环遍历,如果有属性,就返回false,没有就是true

err()

  • 接受一个字符串,抛出一个包含了该字符串的异常。
  • 开发插件时可以覆盖这个方法,用来显示更有用或更多的错误提示消息
支付宝打赏 微信打赏

赞赏是对我们的肯定!