2011-01-29 71 views
2

我刚开始学习jQuery和OO Javascript,所以我试图弄清楚哪些属于哪个以及他们做了什么。我jQuery的文档跨此代码来需要帮助解密JQuery示例

(function($sub) { 

    $sub // a subclass of jQuery 
    $sub === jQuery; //= false 

    $sub.fn.myCustomMethod = function(){ 
    return 'just for me'; 
    } 

    $sub(document).ready(function() { 
    $sub('body').myCustomMethod(); //= 'just for me' 
    }); 

})(jQuery.subclass()); 

问题:

  1. 为什么(函数所包围()
  2. 这是什么意思(jQuery.subclass());是?这是一个JQuery的事情或常规的JavaScript的一部分吗?

感谢

回答

5

(1)自调用函数

function() { 

}(); 

都对自己无效的,因为它们会导致语法错误,它的混乱看到它调用的底部。

这就是为什么JavaScript社区在自调用函数启动时使用(让其他代码读者意识到它不是一个正常函数。

var o = (function() { 

})(); 

每当我看到有(启动功能,我知道,这是自调用。这意味着它立即执行并且o包含函数的返回值而不是函数。

(2)的jQuery子类

警惕,使用子类依赖于具有jQuery的1.5。我建议你等待官方发布,而不是使用1.5 RC1,因为有一些问题需要解决。

jQuery.subclass是jQuery 1.5 beta的一部分。这是jQuery的一个新功能,它实质上构成了jQuery的一个子类。

这意味着您添加到jQuery.subclass的任何内容都不会添加到jQuery中。这个jQuery子类有jQuery的所有功能,但任何您添加或更改不会影响“全球jQuery的”

注释样品来源

// self invoking function. This creates a closure so that anything declared in 
// this function is local and doesn't effect global state 
(function($sub) { 

    $sub // a subclass of jQuery 
    $sub === jQuery; //= false 

    // here we extend $.fn with a new method. This actually extends the prototype of $sub 
    // $sub.fn === $sub.prototype === $() 
    // $sub.fn is actually a new jQuery object. This means that when using $sub we first look 
    // for method defined on $sub.fn, and if there aren't any we look on methods defined 
    // on $.fn. A useful feature of this is that you can overwrite methods 
    $sub.fn.myCustomMethod = function(){ 
    return 'just for me'; 
    } 

    // We can "overwrite" methods of jQuery by hiding the original methods. 
    $sub.fn.attr = function() { 
    alert("new attr!"); 
    // you can go into $sub.superclass to get the original $ object and call methods there 
    $sub.superclass.attr.apply(this, arguments); 

    } 

    // This calls .ready from the original jQuery 
    $sub(document).ready(function() { 
    $sub('body').myCustomMethod(); //= 'just for me' 
    }); 

// we pass in a subclass of jquery at the bottom. This means that $sub has all the 
// functionality of $ but doesn't change $ itself. 
})(jQuery.subclass()); 

免责声明.__proto__弃用。它仅用于说明jQuery.subclass原型链的外观。

对于那些谁了解.__proto__(此获取对象的构造函数的原型)

var $sub = jQuery.subclass(); 
$sub.__proto__ === $sub.fn; // true 
$sub.__proto__.__proto__ === $.fn; // true 

// example of .__proto__ 
function constructor() { } 
var o = new constructor; 
o.__proto__ === constructor.prototype; // true 

如果需要进一步的解释,或者如果您想了解什么都请不要客气。我可能会掩饰一些我认为很明显的东西。

2
  1. 这是一个返回匿名函数的表达式。使用jQuery.subclass())将结果函数立即调用(第二对圆括号)作为单个参数。
  2. 这是一个jQuery的东西。它允许你创建一个“自定义” JQuery的类,同时仍留有可供其他脚本不变JQuery的页面上(http://api.jquery.com/jQuery.subclass/
+0

@Goleztroll technolally该表达式返回调用后自外部括号结束后调用的函数的值。 – Raynos 2011-01-29 23:29:05

+0

不,它不。只有函数声明包含在括号中。括号在函数的关闭`}`之后关闭。 – GolezTrol 2011-01-29 23:33:21

0

我会尽力解释它

  1. 功能被包围(),因为这是你如何制作javascript closure。全局范围(窗口)内的()代码将不可见。代码使用一个参数创建匿名函数,并且在使用作为函数参数传递的jQuery.subclass()进行声明后调用该函数。

例如:

function dirty($arg) {...}是从全球范围

(function dirty($arg) {...})("some arg");不是在全局范围内可见可见 - 它创建了它自己的范围内的功能,立即调用它,如果它不分配到一个变量,引用丢失

以这种方式,你可以改变jQuery的功能而不用改变全局jQuery对象。我不知道这怎么可能是有用的,但是这就是它:) 2.从jQuery的API文档 -

创建了jQuery 对象的子类,允许您添加额外的 或改变jQuery方法和 属性,而不影响全局jQuery的 。