$(function(){console.log($("a").html())
//上面是jquery的
//下面是我模拟的
;(function(win,fn){fn(win)}(window,function(win){ var G= function(filter) { return new G.fn.init(filter); } G.fn =G.prototype = { sayHello: function(a) { console.log("G"+a);return G(a)} }; window.G=G; var init = G.fn.init=function(filter){}; init.prototype=G.prototype; })); console.log(G(2).sayHello(3).sayHello(4).sayHello(5));
看了半天才反应过来,原因是因为$("a").html()返回的不是jquery对象,而是字符串,log输出当然就是字符串了。而你模拟的返回值一直是一个对象,只不过内部log输出了字符串。
同样的还有width(),height(),scrollTop()等方法返回值都不是jquery对象,也就不能链式调用了
注:你上面的js代码和下面的输出结果不对应,让我看了半天
修改:上面三个方法如果是读取数据,返回值就是字符串或者数字,如果是赋值数据,那么返回值还是jquery对象,而且就是自己本身
不对吧,那比如$("a").ecah(function)
前半部分$("a")是jq对象吧,返回值[<a>,<a>,...]
却也能引用each
@王那个锋啊:
你的第一行代码:console.log($("a").html());
执行的时候:$("a").html()这个表达式返回值是字符串,然后使用console.log()函数输出
至于你说的$("a").each(function),$("a")肯定是jquery对象,而且$("a").each(function)返回值也是jquery对象,而且就是$("a"),所以你可以继续链式调用,$("a").each().addClass()等等
你只要明白一点就行了,虽然jquery对象的大部分方法都是返回jquery对象,但是也有一些方法的返回值不是jquery对象,而是字符串或者数字。这时候就不能继续链式调用了。
@ThreeTree: 其实我感觉我就是纠结在log值,比如:
function type(a){return Object.prototype.toString.call(a)} console.log($("a")); console.log("上面jq对象的log值和数组输出一样,但是类型是:"+ type($("a"))+"。我想知道他这么实现的原理是啥,菜鸟伤不起") ;(function(win,fn){fn(win)}(window,function(win){ var G= function(filter) { return new G.fn.init(filter); } G.fn =G.prototype = { sayHello: function(a) { console.log("G"+a);return this} }; window.G=G; var init = G.fn.init=function(filter){}; init.prototype=G.fn; return this })); console.log(G(2).sayHello(3).sayHello(4).sayHello(5));
想知道 jquery是怎么处理返回数据的,看jquery源码绕晕了
@ThreeTree:
@王那个锋啊: 首先$("a")是一个jQuery对象,是一个Object,所以上面的type()函数输出是正确的。但是console.log()方法输出的结果是一个数组,是因为http://blogread.cn/it/article/2253
顺便说一句,在chrome浏览器下,console.log()输出的是一个对象。
@ThreeTree: 没文化真可怕,求推荐几本书看看,
@ThreeTree: 我在说我。。
@王那个锋啊: 《悟透javascript》和 《javascript语言精粹》 这是我比较喜欢的两本。其他的你直接百度相关书籍,然后看评价,如果评价好,就看。
还有一点建议:提问题的时候最好明确指出问题是什么,最好还有预期结果和实际结果。反正我看你的问题需要各种猜测你究竟想问什么?主要原因是你自己已经处在解决问题的上下文中了,所以没有感觉出来。