CMS*_*CMS 843

在jQuery中,fn属性只是属性的别名prototype.

jQuery标识符(或$)仅仅是一个构造函数,并用它创建的所有实例,从构造函数的原型继承.

一个简单的构造函数:

function Test() {
  this.a = 'a';
}
Test.prototype.b = 'b';

var test = new Test(); 
test.a; // "a", own property
test.b; // "b", inherited property
Run Code Online (Sandbox Code Playgroud)

一个类似于jQuery体系结构的简单结构:

(function() {
  var foo = function(arg) { // core constructor
    // ensure to use the `new` operator
    if (!(this instanceof foo))
      return new foo(arg);
    // store an argument for this example
    this.myArg = arg;
    //..
  };

  // create `fn` alias to `prototype` property
  foo.fn = foo.prototype = {
    init: function () {/*...*/}
    //...
  };

  // expose the library
  window.foo = foo;
})();

// Extension:

foo.fn.myPlugin = function () {
  alert(this.myArg);
  return this; // return `this` for chainability
};

foo("bar").myPlugin(); // alerts "bar"
Run Code Online (Sandbox Code Playgroud)

  • 这保证是真的吗?我可以假设对jQuery.prototype的调用与jQuery.fn完全相同吗?我担心的是,当你调用.fn时,jQuery会有一些魔力,那么它们就不可互换了 (4认同)
  • 哦,我错过了什么......'window.foo = foo'给'foo'一个全球范围?从来没有新的,我会把它添加到我要学习的技术列表中. (4认同)
  • @Shawn我认为它会被称为属性,而不是参数,对吧?参数将是'a'变量,这里是`function func1(a){...}`,属性将是'a'变量,这里`var foo = {}; foo.a ='a'`. (3认同)
  • @ EE33如果我没弄错,javascript中的全局范围只是意味着你的变量是窗口对象的参数. (2认同)

And*_*y E 144

jQuery.fn是为了简化而定义的jQuery.prototype.从源代码:

jQuery.fn = jQuery.prototype = {
    // ...
}
Run Code Online (Sandbox Code Playgroud)

这意味着jQuery.fn.jquery是一个别名jQuery.prototype.jquery,它返回当前的jQuery版本.再次从源代码:

// The current version of jQuery being used
jquery: "@VERSION",
Run Code Online (Sandbox Code Playgroud)

  • 我喜欢这个答案.我准确地展示了如何在源代码中找到定义,然后如何以有用的方式解释定义.好的''教人钓鱼'的回答方法.+1. (14认同)

Tra*_*s J 143

fn字面意思是指jquery prototype.

这行代码在源代码中:

jQuery.fn = jQuery.prototype = {
 //list of functions available to the jQuery api
}
Run Code Online (Sandbox Code Playgroud)

但真正的工具背后fn是它可以将你自己的功能挂钩到jQuery中.请记住,jquery将是函数的父作用域,因此this将引用jquery对象.

$.fn.myExtension = function(){
 var currentjQueryObject = this;
 //work with currentObject
 return this;//you can include this if you would like to support chaining
};
Run Code Online (Sandbox Code Playgroud)

所以这是一个简单的例子.让我们说我想做两个扩展,一个放蓝色边框,然后将文本颜色为蓝色,我希望它们被链接.

jsFiddle Demo

$.fn.blueBorder = function(){
 this.each(function(){
  $(this).css("border","solid blue 2px");
 });
 return this;
};
$.fn.blueText = function(){
 this.each(function(){
  $(this).css("color","blue");
 });
 return this;
};
Run Code Online (Sandbox Code Playgroud)

现在你可以对这样的类使用它们:

$('.blue').blueBorder().blueText();
Run Code Online (Sandbox Code Playgroud)

(我知道这最好用css完成,例如应用不同的类名,但请记住这只是一个展示概念的演示)

这个答案有一个完整的扩展的好例子.

  • 你不能只跳过示例代码中的`each`吗?`$ .fn.blueBorder = function(){this.css("border","solid blue 2px"); 归还这个; ``会工作正常,因为`.css()`alerady迭代元素. (11认同)
  • @SoonDead - 你当然可以,因为如果jQuery对象拥有一个集合,那么`css`函数将自动在内部迭代它们.这只是显示"this"中差异的一个例子,其中外部的是jquery对象,而内部的是引用元素本身. (6认同)
  • 这是最好的评论 - 知道fn只是一个别名并不像知道为什么有人应该关心那样有用,这个答案很好地证明了它. (5认同)

小智 19

$ .fn是jQuery.prototype的别名,它允许您使用自己的函数扩展 jQuery。

例如:

 $.fn.something = function{}
Run Code Online (Sandbox Code Playgroud)

将允许你使用

$("#element").something()
Run Code Online (Sandbox Code Playgroud)

$ .fn也是jQuery.fn 的同义词。

  • 这就是我一直在寻找的!多谢 :) (2认同)