var foo = function(){alert('foo')}
function bar(){alert('bar')}
为什么foo.prototype
指向对象,但在命名的功能bar.prototype
点本身之间的原型区别?函数的声明和表达
我应该补充说,这种行为是从浏览器控制台观察到的。
var foo = function(){alert('foo')}
function bar(){alert('bar')}
为什么foo.prototype
指向对象,但在命名的功能bar.prototype
点本身之间的原型区别?函数的声明和表达
我应该补充说,这种行为是从浏览器控制台观察到的。
如果您使用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
同意,控制台的行为非常具有误导性。这种行为的可能原因是为新实例记录构造函数的名字,即'var b = new bar();的console.log(b)中; // bar'。 – bfavaretto
美丽的答案,谢谢。 – mystrdat
因为在你的例子中var foo
它是指向匿名函数的指针。
比较
var foo = function me(){alert('foo');}
test=foo;
console.log(test.prototype);
这里var foo
是指针命名函数。
'function(){// do something}'本身匿名函数没有上下文,没有理由把它分成两种不同的类型 –
是的,我的例子是和OP例子比较,我的示例显示了命名函数,它几乎等于@ bfavaretto的答案 –
对不起。你想说什么? 'foo.prototype'和'bar.prototype'都应该分别指向'foo'和'bar'的'prototype'对象。 –
你的问题没有任何意义 - 'foo.prototype'不指向'Object','bar.prototype'不指向'bar':http://jsfiddle.net/2xkpC/ –
@AaditMShah你是对的,但是Chrome控制台在请求函数原型时会记录函数名称。我会一直删除我的答案,直到我弄清楚为止。 – bfavaretto