我已经用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“框架”或框架以及它是如何工作的?
答案 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
对象和它自己的原型”,但是这样做,你正在做的确切你想要的是:使ob
,ob()
以及使用它创建的所有变量(例如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
中的方法。