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

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

我应该补充一点,这种行为是从浏览器控制台观察到的。

4

2 回答 2

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

于 2012-12-06T13:58:55.730 回答
-1

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

相比于

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

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

于 2012-12-06T13:17:08.667 回答