jQuery的骨架如何工作?

时间:2012-11-21 07:16:21

标签: javascript jquery

我已经用JavaScript编程了几年,但我从来没有理解 不同的技术如何在JavaScript中工作,只有 它的工作原理.. < / p>

现在,在正确学习原型和构造函数如何工作之后,在我开始为自己的网站创建自己的(不可公开访问的)插件之前,我先看了一下jQuery来学习一些东西。

问题在于我不明白它是如何工作的。这是一个几乎工作的样本: http://jsfiddle.net/3zWvR/1/

(function() {
    test = function(selector) {
        return new test.prototype.init(selector);
    }
    test.prototype = {
        init: function(selector) {
            alert("init ran");
            if (!arguments[0]) {
                return this;
            }
        }
    }
 // As I understand the jQuery code, the next line should really be
 // test.prototype = {
    test.prototype.init.prototype = {
        send: function() {
            alert("send ran");
        }
    }

    window.ob = test;
})()

ob().send();​

我在那里评论了一条线,它显示了我认为如果我像jQuery那样做的话应该在那里。但是我无法复制它,所以你可以做ob.method()......

如何构建jQuery“框架”或框架以及它是如何工作的?

1 个答案:

答案 0 :(得分:3)

嗯,你的问题非常有趣,自从我开始查看jQuery的源代码以来,这就是我的想法。如果添加此代码,您的代码应该可以正常工作:

test.prototype.init.prototype = test.prototype;
test.send = test.prototype.send = function(){
  alert("send ran");
};

而不是:

test.prototype.init.prototype = {
  send: function() {
    alert("send ran");
  }
};

你可能会说“我已经知道了,你只是将方法send()添加到test对象和它自己的原型”,但是这样做,你正在做的确切你想要的是:使obob()以及使用它创建的所有变量(例如var somevar = ob())都使用方法send()

如果你看一下jQuery源代码,他们使用方法extend()来扩展jQuery对象。查看一些.extend()调用,您将看到如果只将一个方法/属性添加到jQuery.fn对象(这是prototype的简写),{{1 object没有那个方法/属性。如果您输入控制台jQuery,则可以看到此内容,它会返回jQuery.off,但undefined对象中存在方法off(类型jQuery.fn一个控制台,你会看到它。)

如果您在jQuery.fn.off中考虑,当您编写插件时,首先要执行jQuery,然后将插件添加到由jQuery.fn.plugin =创建的对象中,但您的插件不是可直接从jQuery访问。

jQuery视为具有大量实用程序的构造函数。执行jQuery时返回的对象包含$(selector)但不是所有jQuery.fn对象中的所有方法,只包含已添加到jQuery中的方法。