2012-12-06 36 views
1
var foo = function(){alert('foo')} 
function bar(){alert('bar')} 

为什么foo.prototype指向对象,但在命名的功能bar.prototype点本身之间的原型区别?函数的声明和表达

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

+0

对不起。你想说什么? 'foo.prototype'和'bar.prototype'都应该分别指向'foo'和'bar'的'prototype'对象。 –

+0

你的问题没有任何意义 - 'foo.prototype'不指向'Object','bar.prototype'不指向'bar':http://jsfiddle.net/2xkpC/ –

+0

@AaditMShah你是对的,但是Chrome控制台在请求函数原型时会记录函数名称。我会一直删除我的答案,直到我弄清楚为止。 – bfavaretto

回答

5

如果您使用Chrome等控制台记录对象的价值,那么我建议您不要这样做。与其他浏览器控制台一样,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

+0

同意,控制台的行为非常具有误导性。这种行为的可能原因是为新实例记录构造函数的名字,即'var b = new bar();的console.log(b)中; // bar'。 – bfavaretto

+0

美丽的答案,谢谢。 – mystrdat

-1

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

比较

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

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

+0

'function(){// do something}'本身匿名函数没有上下文,没有理由把它分成两种不同的类型 –

+0

是的,我的例子是和OP例子比较,我的示例显示了命名函数,它几乎等于@ bfavaretto的答案 –