2

我用 JavaScript 编程已经有几年了,但我从来没有理解不同的技术在 JavaScript 中是如何工作的,只是有效..

现在,在正确学习了原型和构造函数的工作原理之后,我在着手为自己的网站制作自己的(不可公开访问的)插件之前,先看看 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“框架”或骨架是如何构建的,它是如何工作的?

4

1 回答 1

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对象和自身的原型中”,但是这样做,您正在做您想做的事: make thatob以及ob()使用创建的所有变量它,喜欢var somevar = ob()有方法send()

如果你看一下 jQuery 源代码,他们使用方法extend()来扩展 jQuery 对象。查看一些.extend()调用,您会发现如果仅将一个方法/属性添加到jQuery.fn对象(即 的简写prototype),则该jQuery对象没有该方法/属性。如果您在控制台中输入,您可以看到这一点jQuery.off,它会返回undefined,但该方法off存在于jQuery.fn对象中(jQuery.fn.off在控制台中输入,您将看到它)。

如果你想jQuery,当你写一个插件时,你从做开始jQuery.fn.plugin =,所以你将你的插件添加到由创建的对象中jQuery,但是你的插件不能直接从jQuery.

可以将jQuery其视为也具有许多实用程序的构造函数。当您确实$(selector)拥有所有方法jQuery.fn但不是所有对象时返回的jQuery对象,只有他们添加到jQuery.fn.

于 2012-11-21T14:40:19.840 回答