是否有一种快速的方法来检查一个对象是jQuery对象还是原生JavaScript对象?

例子:

var o = {};
var e = $('#element');

function doStuff(o) {
    if (o.selector) {
        console.log('object is jQuery');
    }
}

doStuff(o);
doStuff(e);

显然,上面的代码可以工作,但并不安全。你可以给o对象添加一个选择器键并得到相同的结果。是否有更好的方法来确保对象实际上是一个jQuery对象?

(typeof obj == 'jquery')


当前回答

你可以使用instanceof操作符:

if (obj instanceof jQuery){
    console.log('object is jQuery');
}

说明:jQuery函数(又名$)是作为构造函数实现的。构造函数将使用新前缀调用。

当调用$(foo)时,jQuery内部会将其转换为新的jQuery(foo)1。JavaScript继续在构造函数中初始化它,以指向一个新的jQuery实例,并将它的属性设置为jQuery上的属性。prototype(又名jQuery.fn)。因此,您将得到一个新对象,其中instanceof jQuery为真。


它实际上是新的jQuery.prototype.init(foo):构造函数逻辑已经被卸载给另一个构造函数init,但概念是一样的。

其他回答

你也可以像下面描述的那样使用.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! ');
}

签出instanceof操作符。

var isJqueryObject = obj instanceof jQuery

你可以使用instanceof操作符:

if (obj instanceof jQuery){
    console.log('object is jQuery');
}

说明:jQuery函数(又名$)是作为构造函数实现的。构造函数将使用新前缀调用。

当调用$(foo)时,jQuery内部会将其转换为新的jQuery(foo)1。JavaScript继续在构造函数中初始化它,以指向一个新的jQuery实例,并将它的属性设置为jQuery上的属性。prototype(又名jQuery.fn)。因此,您将得到一个新对象,其中instanceof jQuery为真。


它实际上是新的jQuery.prototype.init(foo):构造函数逻辑已经被卸载给另一个构造函数init,但概念是一样的。

你可以通过JQuery属性检查对象是否是由JQuery生成的:

myObject.jquery // 3.3.1

=>如果对象是JQuery生成的,则返回JQuery版本号。 =>否则返回undefined

对于那些想要在没有安装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;
}