gpt4 book ai didi

javascript - jQuery.extend 和 jQuery.fn.extend

转载 作者:行者123 更新时间:2023-11-30 05:51:46 29 4
gpt4 key购买 nike

我正在用 extend 做一些测试,在我做了一些观察后我有点困惑。初步观察:

console.log($.extend === $.fn.extend); // trure
// and since $ === jQuery then ...
console.log(jQuery.extend === jQuery.fn.extend); // true

到目前为止还不错,不是吗?鉴于上述结果,我认为这样做:

// SNIPPET 1
$.extend({
log: function(m) {
console.log(m);
}
});

还有这个:

// SNIPPET 2
$.fn.extend({
log: function(m) {
console.log(m);
}
});

是同样的事情。但事实上,情况完全不同。事实上,如果您运行 SNIPPET 1 然后执行以下操作:

$("body").log("whatever");

你得到一个错误(日志未定义)。但你可以这样做:

$.log("whatever");

如果你改为运行 SNIPPET 2,你会得到相反的结果,也就是说:

$("body").log("whatever"); // this will work
$.log("whatever"); // this won't

什么鬼?我很欣赏 .extend 扩展了执行它的对象($ vs $.prototype),但我没有得到的是它是怎么做到的!特别是考虑到以下事实:

$.extend === $.fn.extend // true

功能是一样的!!它如何产生 2 个不同的结果?

最佳答案

在函数内 this 会有所不同。在第一种情况下它将是 $,在第二种情况下它将是 $.fn

看看 source code :

jQuery.extend = jQuery.fn.extend = function() {
var options, name, src, copy, copyIsArray, clone,
target = arguments[0] || {},
i = 1,
length = arguments.length,
deep = false;

// ...

// extend jQuery itself if only one argument is passed
if ( length === i ) {
target = this;
--i;
}

// ...
};

Learn more about this .

关于javascript - jQuery.extend 和 jQuery.fn.extend,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14294782/

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