- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
jQuery 被定义为一个函数
jQuery.extend
被定义为函数属性,它本身就是一个函数 - 但不可用于任何 this
范围。
jQuery.fn.extend
被定义为原型(prototype) object 属性 - 因此在 this
为什么要以这种方式定义jQuery.extend
,因为 jQuery 实际上并不是一个对象,而是一个函数?
供引用,令人困惑的代码行是:
jQuery.extend = jQuery.fn.extend = function() {...}
注意到
jQuery.fn === jQuery.prototype
这是一个对象 {},jQuery 是一个函数
这意味着直接使用jQuery.extend
,没有为 this 上下文实例化对象。
我在 jQuery 代码中没有看到任何地方将 jQuery 设置为新的 jQuery() 实例。在 jQuery 构造函数中,我看到返回的唯一实例是 init 函数,即返回 new jQuery.fn.init()。
在运行时,在文档就绪函数中,如果您检查 jQuery 和 $ 是什么类型的对象,您将看到它仍然是一个函数(而不是对象实例)。因此,每当使用一个参数调用 jQuery.extend 时,该函数都会尝试扩展 jQuery 本身,但使用“this”作为目标对象,即代码片段
// Extend jQuery itself if only one argument is passed
if (i === length) {
target = this;
i--;
}
现在,在我的测试中,扩展函数中的“this”指的是 jQuery 函数,而不是对象实例,因此该函数正在使用函数的额外“属性”进行扩展。我不明白的是,当函数尚未通过任何新实例创建实例化时,如何向函数添加/扩展对象属性?
最佳答案
jQuery.extend
实际上只是一个用于合并对象的实用函数。它类似于更现代的 Object.assign()
jQuery 库启动时不存在
它在核心中广泛用于向 jQuery 对象本身添加属性,但开发人员也可以使用 $.extend(target [, object1 ] [, objectN ] )
来合并自己的对象。
由于它用作静态方法,因此没有 new
实例。
还有其他几种 jQuery 方法,它们既在内部用作实用函数,又公开公开,例如 jQuery.each
和 jQuery.fn.each
,它们先于现代Array#forEach()
但也可用于迭代对象
在您自己的代码中使用它可以让您做到
var a = {x:1},
b = {y:2},
res = $.extend({}, a, b)
console.log(res) // new object { "x": 1, "y": 2}
console.log(a) // unmodified - still {x:1}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
至于您注意到的部分,其中 target = this;
可以使用具有函数作为属性的简单对象来解释。由于调用上下文,函数中的 this
是对象本身。
当在源核心内调用时,该对象是 jQuery
简单对象示例:
var obj = function() {};
obj.x = 1;
obj.log = function() {
// `this` is `obj`
console.log('this.x = ', this.x)
}
obj.log()
关于jquery - 为什么 jQuery.extend 定义为 jQuery 函数属性,而 jQuery.fn.extend 定义为 jQuery 原型(prototype)对象属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48520067/
你能比较一下属性吗 我想禁用文本框“txtName”。有两种方式 使用javascript,txtName.disabled = true 使用 ASP.NET, 哪种方法更好,为什么? 最佳答案 我
Count 属性 返回一个集合或 Dictionary 对象包含的项目数。只读。 object.Count object 可以是“应用于”列表中列出的任何集合或对
CompareMode 属性 设置并返回在 Dictionary 对象中比较字符串关键字的比较模式。 object.CompareMode[ = compare] 参数
Column 属性 只读属性,返回 TextStream 文件中当前字符位置的列号。 object.Column object 通常是 TextStream 对象的名称。
AvailableSpace 属性 返回指定的驱动器或网络共享对于用户的可用空间大小。 object.AvailableSpace object 应为 Drive 
Attributes 属性 设置或返回文件或文件夹的属性。可读写或只读(与属性有关)。 object.Attributes [= newattributes] 参数 object
AtEndOfStream 属性 如果文件指针位于 TextStream 文件末,则返回 True;否则如果不为只读则返回 False。 object.A
AtEndOfLine 属性 TextStream 文件中,如果文件指针指向行末标记,就返回 True;否则如果不是只读则返回 False。 object.AtEn
RootFolder 属性 返回一个 Folder 对象,表示指定驱动器的根文件夹。只读。 object.RootFolder object 应为 Dr
Path 属性 返回指定文件、文件夹或驱动器的路径。 object.Path object 应为 File、Folder 或 Drive 对象的名称。 说明 对于驱动器,路径不包含根目录。
ParentFolder 属性 返回指定文件或文件夹的父文件夹。只读。 object.ParentFolder object 应为 File 或 Folder 对象的名称。 说明 以下代码
Name 属性 设置或返回指定的文件或文件夹的名称。可读写。 object.Name [= newname] 参数 object 必选项。应为 File 或&
Line 属性 只读属性,返回 TextStream 文件中的当前行号。 object.Line object 通常是 TextStream 对象的名称。 说明 文件刚
Key 属性 在 Dictionary 对象中设置 key。 object.Key(key) = newkey 参数 object 必选项。通常是 Dictionary 
Item 属性 设置或返回 Dictionary 对象中指定的 key 对应的 item,或返回集合中基于指定的 key 的&
IsRootFolder 属性 如果指定的文件夹是根文件夹,返回 True;否则返回 False。 object.IsRootFolder object 应为&n
IsReady 属性 如果指定的驱动器就绪,返回 True;否则返回 False。 object.IsReady object 应为 Drive&nbs
FreeSpace 属性 返回指定的驱动器或网络共享对于用户的可用空间大小。只读。 object.FreeSpace object 应为 Drive 对象的名称。
FileSystem 属性 返回指定的驱动器使用的文件系统的类型。 object.FileSystem object 应为 Drive 对象的名称。 说明 可
Files 属性 返回由指定文件夹中所有 File 对象(包括隐藏文件和系统文件)组成的 Files 集合。 object.Files object&n
我是一名优秀的程序员,十分优秀!