【问题标题】:Why console don't show methods of jQuery object returned from selector?为什么控制台不显示从选择器返回的 jQuery 对象的方法?
【发布时间】:2016-01-19 16:26:18
【问题描述】:

我知道如果我输入:

$('body');

我得到一个 jQuery 对象。然而,在 chrome 的控制台上,我只会看到 jQuery 对象的内部数组,尽管 jQuery 方法可以像

一样访问

$('body').hide();

为什么控制台没有显示所有可访问的方法以及 jQuery 是如何做到这一点的?

如果只是因为这些方法是在原型上定义的,那我怎么写这些行:

function Person(){this.myProp = 'test'};
var person = new Person();
Person.prototype.proto = 'test2';

然后我会检查 chrome 中的人,我会看到:

__proto__: Person constructor: Person() proto: "test2"

但是在检查 $('body'); 时,开发工具上没有显示 proto

【问题讨论】:

  • jQuery 方法在 prototype 上,而不是在每个单独的对象上。
  • $('body') 返回一个继承自 $.fn 的对象。如果您使用控制台检查它,您将看到一个名为 __proto__[[Prototype]] 或类似名称的条目。
  • @Oriol - 实际上我一直在寻找这样的东西,但自己尝试一下 - $('body') 只返回数组。 Chrome 不显示除此之外的任何其他内容?
  • @BornToCode 他们搞砸了 Chrome 的控制台。最好使用 Firefox 的。 $('body') 返回一个类似数组的对象,它不是数组,它通过内部 [[Prototype]] 从 $.fn 继承。编辑:改用console.log($('body'))

标签: javascript jquery google-chrome console google-chrome-devtools


【解决方案1】:

方法在对象的原型上。默认情况下,控制台和console.log() 都不显示原型上的项目。

如果您在 Chrome 调试器中检查 jQuery 对象,您可以展开原型,然后可以看到那里的所有方法。

所以,您所看到的只是控制台的选定实现。它显示直接的实例属性,而不是原型上的项目。


当我将此代码放入页面时:

function Person(){this.myProp = 'test'};
Person.prototype.proto = 'test2';

var person = new Person();
var jq = $("body");

然后,在 Chrome 调试器中检查 personjq,我看到了:

显示两个对象的 `proto 属性。而且,如果我为 jQuery 对象扩展该属性,它确实会显示所有方法。

【讨论】:

  • +1 但是,当我使用原型扩展我自己的对象时,我确实看到了 __proto__ 属性,由于某种原因,该属性在 jQuery 对象上不存在? (参见我的编辑示例)
  • @BornToCode - 看看我在答案中添加了什么。
  • Chrome 的调试器确实显示了 jQuery 对象上 Chrome 控制台上不可见的原型;我接受你的回答。
猜你喜欢
  • 2016-01-28
  • 1970-01-01
  • 1970-01-01
  • 2016-09-11
  • 1970-01-01
  • 2017-07-02
  • 2012-04-16
  • 2018-05-31
相关资源
最近更新 更多