Dav*_*ing 587 javascript jquery
有没有快速检查对象是jQuery对象还是本机JavaScript对象的方法?
例:
var o = {};
var e = $('#element');
function doStuff(o) {
if (o.selector) {
console.log('object is jQuery');
}
}
doStuff(o);
doStuff(e);
Run Code Online (Sandbox Code Playgroud)
显然,上面的代码有效,但不安全.您可以向o对象添加选择器键并获得相同的结果.有没有更好的方法来确保对象实际上是一个jQuery对象?
符合的东西 (typeof obj == 'jquery')
Cre*_*esh 856
您可以使用instanceof运营商:
obj instanceof jQuery
Run Code Online (Sandbox Code Playgroud)
说明:jQuery函数(aka $)是作为构造函数实现的.使用new前缀调用构造函数.
当你调用时$(foo),jQuery会将其转换为new jQuery(foo)1.JavaScript继续this在构造函数内初始化以指向新实例jQuery,将其属性设置为jQuery.prototype(又名jQuery.fn)上找到的属性.因此,你会得到一个new对象,其中instanceof jQuery为true.
1 它实际上是new jQuery.prototype.init(foo):构造函数逻辑已被卸载到另一个被调用的构造函数init,但概念是相同的.
mt8*_*t81 105
您也可以使用如下所述的.jquery属性:http://api.jquery.com/jquery-2/
var a = { what: "A regular JS object" },
b = $('body');
if ( a.jquery ) { // falsy, since it's undefined
alert(' a is a jQuery object! ');
}
if ( b.jquery ) { // truthy, since it's a string
alert(' b is a jQuery object! ');
}
Run Code Online (Sandbox Code Playgroud)
Cor*_*old 30
查看instanceof运算符.
var isJqueryObject = obj instanceof jQuery
Run Code Online (Sandbox Code Playgroud)
jhe*_*rax 24
检查对象实例的最佳方法是通过instanceof运算符或方法isPrototypeOf()来检查对象的原型是否在另一个对象的原型链中.
obj instanceof jQuery;
jQuery.prototype.isPrototypeOf(obj);
Run Code Online (Sandbox Code Playgroud)
但有时在文档上有多个jQuery实例的情况下可能会失败.正如@Georgiy Ivankin所说:
如果我有
$我当前名字空间指向jQuery2和我有一个从外部命名空间(其中一个对象$是jQuery1),那我也没办法使用instanceof的检查,如果对象是一个jQuery对象
解决该问题的一种方法是在闭包或IIFE中对jQuery对象进行别名处理
//aliases jQuery as $
(function($, undefined) {
/*... your code */
console.log(obj instanceof $);
console.log($.prototype.isPrototypeOf(obj));
/*... your code */
}(jQuery1));
//imports jQuery1
Run Code Online (Sandbox Code Playgroud)
克服这个问题的其他方法是通过查询jquery财产obj
'jquery' in obj
Run Code Online (Sandbox Code Playgroud)
但是,如果您尝试使用原始值执行该检查,则会抛出错误,因此您可以通过确保obj成为一个错误来修改先前的检查Object
'jquery' in Object(obj)
Run Code Online (Sandbox Code Playgroud)
虽然前面的方法不是最安全的(您可以'jquery'在对象中创建属性),但我们可以通过使用这两种方法来改进验证:
if (obj instanceof jQuery || 'jquery' in Object(obj)) { }
Run Code Online (Sandbox Code Playgroud)
这里的问题是任何对象都可以将属性定义jquery为自己的属性,因此更好的方法是在原型中询问,并确保对象不是null或undefined
if (obj && (obj instanceof jQuery || obj.constructor.prototype.jquery)) { }
Run Code Online (Sandbox Code Playgroud)
由于强制,该if语句将作简短的电路通过评估&&当操作者obj是任何的falsy值(null,undefined,false,0,""),然后前进到执行其他的验证.
最后我们可以编写一个实用函数:
function isjQuery(obj) {
return (obj && (obj instanceof jQuery || obj.constructor.prototype.jquery));
}
Run Code Online (Sandbox Code Playgroud)
让我们来看看:逻辑运算符和truthy/falsy
对于那些想知道一个对象是否是 jQuery 对象而没有安装 jQuery 的人来说,以下代码片段应该可以完成工作:
function isJQuery(obj) {
// All jQuery objects have an attribute that contains the jQuery version.
return typeof obj === "object" && obj != null && obj.jquery != null;
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
160184 次 |
| 最近记录: |