Javascript obj.foo()和obj(a.foo)-解决方案是如何做到这一点的?(jQuery的创意)

Javascript obj.foo()和obj(a.foo)-解决方案是如何做到这一点的?(jQuery的创意),javascript,jquery,Javascript,Jquery,首先,我为我糟糕的英语感到抱歉。我必须练习,并将尽我最大的努力 我将用javascript为自己尝试一些新的东西。我是从jQuery图书馆得到这个想法的。有两个 使用“jQuery”或“$”的不同方法 jQuery(arg).foo(); // first way jQuery.foo(); // second way 现在我想对一个对象做同样的事情 obj(arg).foo(); obj.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()进行操作,但没有任何效果-无论如何,我尝试了一些返回的错误:foo()未定义

你知道jQuery是如何解决这个问题的吗?以这种非正常的方式注册变量jQuery

以下是我想要实现的(代码不起作用!):


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

你可以写

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

someFunction.someProperty();

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

你可以写

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

someFunction.someProperty();

这里有一个小提琴,展示了jQuery是如何实现的(不完全是这样,但核心逻辑就在那里)

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

因为它会返回自身,所以所有的属性和方法都会返回并作为一个链提供。jQuery的诀窍在于,它将元素存储在这个数组中,但要像在数组中一样使用整数键

这就是我在这一行的例子中所做的

this[0] = document.getElementById(id);
这意味着该元素现在是存储的,并且可用于所有属于该元素的方法,因此当我调用colorMe时,[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');
});

这里有一个小提琴,展示了jQuery是如何实现的(不完全是这样,但核心逻辑就在那里)

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

因为它会返回自身,所以所有的属性和方法都会返回并作为一个链提供。jQuery的诀窍在于,它将元素存储在这个数组中,但要像在数组中一样使用整数键

这就是我在这一行的例子中所做的

this[0] = document.getElementById(id);
这意味着该元素现在是存储的,并且可用于所有属于该元素的方法,因此当我调用colorMe时,[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。可能的重复(jQuery方法比您预期的稍微复杂一些,因为它包括一个解决方案,该解决方案不需要在
jQuery
构造函数之前添加前缀
new
)。您需要学习更高级的Javascript。可能的重复(jQuery方法比您预期的要稍微复杂一些,因为它包含了一个解决方案,不需要在
jQuery
构造函数之前加前缀
new
)。