2011-06-22 73 views
9

如果我發出jQuery的構造函數和init

console.dir(jQuery.prototype) 

我得到的是jQuery對象中的方法和屬性漂亮的列表。但是構造函數和init在它們旁邊有一個加號。

問:什麼使構造函數和init不同於其他函數?

+0

它們與Chromium上的所有其他產品一樣。 –

+0

儘管我對此一無所知,但我敢打賭,它必須能夠「覆蓋」附加到jQuery對象的方法。 jQuery的擴展方法可以像這樣Object.prototype.thisFunc = function(){// dosomething};期待正確的答案tho – MoarCodePlz

+0

在哪個瀏覽器看起來不同?在Chrome中都一樣。 –

回答

1

它顯示這些函數具有爲它們定義/設置的附加屬性/方法。

2

我想這是因爲構造函數和init不只是「純」功能。這意味着他們有額外的屬性(例如,init有自己的原型),這就是爲什麼它們是可擴展的。要遠一點說明這一點:

// size is defined as something like this 
jQuery.prototype.size = function() { 
    // do stuff 
}; 
// init is defined as a function too, but with additional properties 
jQuery.prototype.init = function() { 
    // do other stuff 
}; 
jQuery.prototype.init.functionIsAnObject = true; 

換句話說:一個函數是一個對象,這意味着你可以將任何你想要的屬性。

+0

你可以附加任何屬性。 'jQuery.each.foo = 5; console.log(jQuery.each.foo);' – Dogbert

+0

@Dogbert:任何對象。它不適用於原始數據類型。像'var x = 3; x.text =「hello world」'不起作用,即x仍然是3,而x.text是未定義的。雖然我認爲在原始數據類型上設置屬性不會像我期望的那樣拋出錯誤... –

3

Firebug檢查函數是否看起來像一個Class函數(obj.prototype包含atleast 1個屬性),並將其顯示爲具有可展開屬性的Class。

http://code.google.com/p/fbug/source/browse/branches/firebug1.8/content/firebug/dom/domPanel.js#531

if (isClassFunction(val)) 
    this.addMember(object, "userClass", userClasses, name, val, level, 0, context); 

http://code.google.com/p/fbug/source/browse/branches/firebug1.8/content/firebug/dom/domPanel.js#1960

function isClassFunction(fn) 
{ 
    try 
    { 
     for (var name in fn.prototype) 
      return true; 
    } catch (exc) {} 
    return false; 
} 

您可以通過在Firebug

運行此
function isClassFunction(fn) 
{ 
    try 
    { 
     for (var name in fn.prototype) 
      return true; 
    } catch (exc) {} 
    return false; 
} 
test = [jQuery.prototype.init, jQuery.prototype.constructor, jQuery.prototype.each, jQuery.prototype.get]; 
for(var i = 0; i < test.length; i++) { 
    console.log("" + i + ": " + isClassFunction(test[i])); 
} 

輸出測試出來

0: true 
1: true 
2: false 
3: false