函数声明和表达式之间的原型区别

时间:2012-12-06 13:12:26

标签: javascript

var foo = function(){alert('foo')}
function bar(){alert('bar')}

为什么foo.prototype指向Object,但命名函数bar.prototype指向自身?

我应该补充一点,从浏览器控制台可以看到这种行为。

2 个答案:

答案 0 :(得分:5)

如果您使用控制台(例如Chrome)记录prototype对象的值,那么我建议您不要这样做。与其他浏览器控制台一样,Chrome控制台会格式化原型对象的输出。

因此,对于命名函数,它将记录函数的name,但对于未命名的函数,它将只记录Object。这并不意味着函数的prototype指向Object或函数本身。这只是控制台向你展示的内容(有人应该为此起诉)。亲眼看看:http://jsfiddle.net/2xkpC/

它如何从prototype知道某个函数的名称?好吧,函数的原型有一个名为constructor的属性,它指向函数本身,函数的名称作为字符串存储在函数的name属性中。因此,如果您记录prototype对象,则会显示prototype.constructor.name || "Object"

var foo = function(){alert('foo')}
console.log(foo.prototype); // logs "Object"

function bar(){alert('bar')}
console.log(bar.prototype); // logs bar.prototype.constructor.name

请参阅此处的演示:http://jsfiddle.net/4bWfn/

如果您打开控制台并单击记录输出附近的那个三角形,那么您将看到原型对象的constructor__proto__属性。在constructor下,您还会看到name属性。

要了解有关JavaScript继承的更多信息,请阅读prototype对象:https://stackoverflow.com/a/8096017/783743

答案 1 :(得分:-1)

因为示例中的var foo是指向匿名函数的指针。

比较
var foo = function me(){alert('foo');}
test=foo;
console.log(test.prototype);

这里var foo是指向命名函数的指针。