也许是一个糟糕的头衔,但这是我的问题: 我正在构建一个框架来了解有关javascript的更多信息。我想用“”jQuery“”风格。
如何在()
可选的情况下创建功能?
$("p").fadeOut(); //() is there
$.each(arr, function(k, v) {...}); //Dropped the (), but HOW?
这是我提出的,但它不起作用:
$2DC = function(selector)
{
return new function() {
return {
circle : function()
{
//...
}
}
}
}
$2DC("#id1"); //Work
$2DC("#id2").circle(); //Work
$2DC.circle(); //DONT WORK
答案 0 :(得分:23)
$
实际上只是jQuery
函数的别名。您可以使用以下命令调用该函数:
jQuery("p");
或$("p");
但请记住,在JavaScript中,您可以将“stuff”直接附加到函数中。
function foo(){
}
foo.blah = "hi";
foo.func = function() { alert("hi"); };
foo.func(); //alerts "hi"
这是(概念上)jQuery的each
函数的定义方式。
jQuery.each = function(someArr, callback) { ...
所以现在jQuery.each
是一个可以这样调用的函数:
jQuery.each([1, 2, 3], function(i, val) {
});
或更熟悉的
$.each([1, 2, 3], function(i, val) {
});
因此,对于您的特定情况,请支持:
$2DC.circle();
您必须将circle
功能直接添加到$2DC
:
$2DC.circle = function(){
// code
};
答案 1 :(得分:6)
函数是JavaScript中的对象。因此,它们可以用作变量,就像整数,字符串等一样。
在您的示例中,$2DC
是一个返回包含circle
函数的对象的函数。
$2DC.circle();
不起作用,因为circle
只是返回对象的属性,而不是$2DC
本身的属性。
对于$.each
,这适用于$
包含each
属性。您的$2DC
也可以这样做。像这样:
$2DC.circle = function(){
}
现在,$2DC.circle();
将有效。因此,正如您所看到的那样,函数是对象,因此可以像其他对象一样具有属性。
答案 2 :(得分:1)
$2DC.circle(); //DONT WORK
这不起作用,因为$ 2DC没有名称为circle
的任何函数。这只是一个功能。
$2DC("#id2")
返回包含具有circle
函数的对象的新函数,因此$2DC("#id2").circle();
可以正常使用。
如果你定义
$2DC.circle = function(){
};
您可以使用$2DC.circle();
答案 3 :(得分:0)
您引用的$.each
方法是$
函数对象上的属性。
jQuery中的$
对象是一个函数对象,与JavaScript中的任何对象一样,您可以在对象上分配属性。
调用$
函数对象充当构造函数,并返回由jQuery.fn.init()
函数创建的新对象实例。 jQuery
的原型被复制到jQuery.fn.init
,以便新创建的对象实例可以访问jQuery
上定义的方法和插件。
答案 4 :(得分:0)
创建基本函数,然后向函数添加方法。
var f = function(text){
alert(text);
}
f.fn1 = function(text){
alert('fn:'+text);
}
f.fn2 = function(text){
alert('fn2:'+text);
}
f('hi'); //hi;
f.fn1('hi'); //fn:hi;
f.fn2('hi'); //fn2:hi;
答案 5 :(得分:0)
可以使用类似的东西来实现。
$.fn.each = function (otherparams);
$.each = function (collection, otherparams) {
return $.fn.each.apply(collection, arguments.slice(1));
};
将每个作为fn的属性(它只是jQuery.prototype的别名)添加意味着它可用作每个jQuery集合的方法。代码的第二位意味着它可以作为参数在集合中传递。
一旦你习惯了它,答案 6 :(得分:-1)
试试这样:
$2DC = (function(selector)
{
return new function() {
return {
circle : function()
{
//...
}
}
}
})();
这样$ 2DC是函数返回的对象,而不是函数本身。