gpt4 book ai didi

javascript - jQuery 如何表现得像一个对象和一个函数?

转载 作者:IT王子 更新时间:2023-10-29 03:21:58 25 4
gpt4 key购买 nike

jQuery$ 似乎是一个函数:

typeof $; // "function"

它就像一个:

$('div').removeClass(); // $ constructs a new object with some methods like removeClass

但是当我去掉函数括号时,它的行为就像一个对象:

$.each(/* parameters */); // $ is an object with some methods like each

我想知道这是怎么可能的,以及如何将这种行为实现到我自己的函数中。

最佳答案

函数也是对象,所以 $.each 可以用与对象类似的方式定义。

JavaScript 是一种原型(prototype)语言。对于 jQuery,这意味着 $ 的每个实例都继承了 jQuery.prototype 的方法。参见注释

一个非常粗糙的演示,以实现类似的行为:

(function() { // Closure to not leak local variables to the global scope
function f(a, b) {
//Do something
}
// Prototype. All properties of f.prototype are inherited by instances of f.
// An instance of f can be obtained by: new f, new f(), Object.create(f)
f.prototype.removeClass = function(a) {
return a;
};
function $(a, b) {
return new f(a, b); // <--- "new f" !
}
$.each = function(a) {
alert(a);
};
window.$ = $; // Publish public methods
})();

//Tests (these do not represent jQuery methods):
$.each("Foo"); // Alerts "Foo" (alert defined at $.each)
alert($().removeClass('Blabla'));// Alerts "Blabla"

注意事项

jQuery的根方法定义如下(只显示相关部分):

(function(win) {
var jQuery = function (selector, context) {
return new jQuery.fn.init(selector, context, rootjQuery);
};
//$.fn = jQuery.fn is a shorthand for defining "jQuery plugins".
jQuery.fn = jQuery.prototype = {
constructor: jQuery,
init: function( /* ..parameters.. */ ) {
//.... sets default properties...
}
//....other methods, such as size, get, etc...
//.... other properties, such as selector, length, etc...
};
jQuery.fn.removeClass = function() { // (Actually via jQuery.fn.extend)
// ... method logic...
}; //...lots of other stuff...

win.$ = win.jQuery = jQuery; //Publish method
})(window);

prototype 方法的优点是链接方法和属性非常容易。例如:

$("body").find("div:first").addClass("foo");

实现此功能的方法可能是:

$.fn.find = function(selector) {
...
return $(...);
};

如果您对 jQuery 的实际实现感兴趣,请查看带注释的源代码:

关于javascript - jQuery 如何表现得像一个对象和一个函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8734115/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com