如果我发出
console.dir(jQuery.prototype)
我得到了一个jQuery对象中的方法和属性的漂亮列表。但构造函数和init是红色的,旁边有一个小加号。
问:构造函数和init与其他函数的不同之处是什么?
答案 0 :(得分:3)
Firebug检查函数是否类似于Class函数(obj.prototype包含至少1个属性),并将其显示为具有可扩展属性的类。
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
答案 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;
换句话说:一个函数是一个Object,这意味着你可以附加你想要的任何属性。
答案 2 :(得分:1)
它表明这些函数具有为其设置/设置的附加属性/方法。