0

起初 - 对不起我糟糕的英语。我必须练习它,并将尽我所能。

我会在 javascript 中为我尝试一些新的东西。我得到了 jQuery 库的想法。那里有两个

使用“jQuery”或“$”的不同方式。

jQuery(arg).foo(); // first way
jQuery.foo();      // second way

现在我想对一个对象做同样的事情。

obj(arg).foo();
obj.foo();

我的第一个问题是:jQuery 如何成为一个返回对象并成为

一样的方法 ?

obj(arg).foo(); 

看起来像一个返回对象的函数。但

obj.foo();

看起来像一个物体。

我尝试了一些与 obj.foo() 和 obj().foo() 一起使用的东西,但没有任何效果 - 无论如何我尝试了一些返回错误的东西: foo() 未定义。

你知道 jQuery 是如何解决它的,以这种不正常的方式注册变量 jQuery 吗?

以下是我想要实现的(代码确实有效!):

myClass = function () {
   this.foo() {
      window.alert('foo()!');
      return this;
   }
}
var myObj = new myClass();
function obj() {
    return myObj.foo(arguments);
}

var obj = {
            secondFoo : function () {
                                        myObj.foo();
                                    }  
          };


obj('arg').foo();     // alert(foo()!) && alert(foo()!)
obj.secondFoo();      // alert(foo()!)
obj('arg');           // alert(foo()!)
4

2 回答 2

2

这是一个小小提琴,显示 jQuery 是如何做到的(不完全是,但核心逻辑在那里)http://jsfiddle.net/UD2Mv/1/

基本上 jQuery 总是返回自己(实际上不是 jQuery 对象,而是 jQuery.fn 的一个实例),除非函数调用期望返回一些东西。

因为它返回自己,所以所有属性和方法都被返回并且可以作为链使用。jQuery 的诀窍是它在其中存储元素,但使用整数键,就像在数组中一样。

这就是我在此行的示例中所做的

this[0] = document.getElementById(id);

这意味着该元素现在已存储并可用于作为其一部分的所有方法,因此当我调用 colorMe 时,this[0] 为我提供了目标元素。

这是代码

function wrap(id) {
    return new wrap.init(id);
};

wrap.init = function(id) {
    this[0] = document.getElementById(id);
    return this;
};

wrap.init.prototype = {
    colorMe: function(color) {
        this[0].style.color = color;
        return this;
    }
};

$(function() {
    wrap('boo').colorMe('red');
});
于 2012-04-26T12:33:51.967 回答
1

在 Javascript 中,所有函数也是对象。

你可以写

someFunction.someProperty = function() { ... };

someFunction.someProperty();
于 2012-04-26T12:23:05.893 回答