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

foo.prototypeはオブジェクトを指しているのに、名前付き関数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);

herevar fooは名前付き関数へのポインタです。

于 2012-12-06T13:17:08.667 に答える