obj.foo() 和 obj(a).foo - 如何做到这一点的解决方案?(jQuery的想法)



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

我会在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()!)

这里有一个小提琴,显示了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');
});

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

你可以写

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

最新更新