起初 - 对不起我的英语很糟糕。我必须练习它,并会尽我所能。
我会在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() 和 obj().foo(),但没有任何效果 - 无论如何,我尝试了一些返回错误的东西:foo() 未定义。
你知道jQuery是如何解决的,以这种不正常的方式注册变量jQuery吗?
以下是我想要实现的(代码不起作用!
myClass = function () {
this.foo() {
window.alert('foo()!');
return this;
}
}
var myObj = new myClass();
function obj() {
return myObj.foo(arguments);
}
var obj = {
secondFoo : function () {
myObj.foo();
}
};
obj('arg').foo(); // alert(foo()!) && alert(foo()!)
obj.secondFoo(); // alert(foo()!)
obj('arg'); // alert(foo()!)
这里有一个小提琴,显示了jQuery是如何做到的(不完全是,但核心逻辑在那里)http://jsfiddle.net/UD2Mv/1/
基本上jQuery总是返回自身(实际上不是jQuery对象,而是jQuery.fn的一个实例),除非函数调用预期返回一些东西。
因为它返回自身,所以所有属性和方法都返回并作为链提供。jQuery所做的技巧是它将元素存储在其中,但通过使用整数键,就像在数组中一样。
这就是我在示例中使用此行所做的
this[0] = document.getElementById(id);
这意味着该元素现在已存储并可用于其中的所有方法,因此当我调用 colorMe 时,this[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中,所有函数也是对象。
你可以写
someFunction.someProperty = function() { ... };
someFunction.someProperty();