var Foo = new function(){
this.A = 1;
this.B = 2;
};
var Bar = {
A: 1,
B: 2
};
typeof Foo === "object"
typeof Bar === "object"
2つの違いは何ですか?`新しい関数(){this.x = 1}`と `{x:1} 'の相違点
Iだけ異なるように、それらの__proto__
オブジェクトが見つかりました:
var Foo = new function(){
this.A = 1;
this.B = 2;
};
var Bar = {
A: 1,
B: 2
};
typeof Foo === "object"
typeof Bar === "object"
2つの違いは何ですか?`新しい関数(){this.x = 1}`と `{x:1} 'の相違点
Iだけ異なるように、それらの__proto__
オブジェクトが見つかりました:
すべての機能はオブジェクトです。あなたの場合、FooとBarは同じですが、最初のものを構築できます。同じトークンに
、私はこの場合はコンストラクタ関数とキーの洞察力は、我々が持っている場合ということだと思います。その後、
function myFoo(){
this.A = 1;
this.B = 2;
};
var Foo1 = new myFoo();
この文脈がfooであります。
var Foo2 = myFoo();
はこのこの場合のwindowオブジェクトは、(あなたが実際にwindow.A = 1を持っているという意味)、現在のコンテキストにバインドされます。
さらに詳しい説明は、MDNのドキュメントを参照してください。
まずノートit's irrelevant that you omitted the parentheses when calling your anonymous function with new
。 JSLintはこれをするのが混乱しているのであなたに叫ぶでしょうが、それは何が起こっているのかです。
私は内部プロトタイプが唯一の違いだと確信しています。通常使用されているようにこれを書き出すほうが簡単かもしれません。あなたのケースで直接変数によって保持されていない匿名関数である - -
var Car = function() {
this.seats = 4;
};
var car1 = new Car();
var car2 = {
seats: 4
};
これを読んで、それは、car1
は、その内部のプロトタイプCar
あるオブジェクトであることを私には明らかだとcar2
は、その内部のプロトタイプオブジェクトであるオブジェクトです。
'car1'のプロトタイプは、' Car'自身のものではなく、 'Car'の' prototype'プロパティの値になります。 – Pointy
OK:私たちはvar Foo = new
機能を持っている
var Foo = new function(){
this.A = 1;
this.B = 2;
};
ランタイムはその内部プロトタイプリンクに設定され、新たに構築されたオブジェクトにthis
設定して、その関数を呼び出すことを意味します —その関数の "プロトタイプ"プロパティの値。これは、初期化時にインスタンス化された無名関数なので、「プロトタイプ」プロパティは単純な空のオブジェクトなので、実際には何もしません。コンストラクタ関数は新しいオブジェクトの2つのプロパティを初期化し、その新しいオブジェクトはnew
式の戻り値です。したがって、Foo
には、その構築されたオブジェクトへの参照が割り当てられ、オブジェクトには2つの割り当てられたプロパティがあります。また、匿名のコンストラクタ関数からの空のオブジェクトを含むプロトタイプチェーンがあり、その後にObjectコンストラクタから継承されたプロトタイプがあります。これで
:
var Bar = {
A: 1,
B: 2
};
我々は変数(Bar
)を有するが、オブジェクト初期化式の結果に設定されています。これは、常にObjectプロトタイプから継承するプレーンオブジェクトを作成します。このオブジェクトがFoo
オブジェクトと異なる唯一の方法は、Foo
オブジェクトがそのプロトタイプチェーンに余分な(空の)オブジェクトを持つことです。だから、
:
Foo
はプレーンオブジェクト、ない機能になってしまうでしょう。Bar
も明白なオブジェクトであり、より明らかに関数ではありません。 Foo
はそのプロトタイプチェーン内の余分な空のオブジェクトを持っているのでFoo
とBar
は(まあ、2つの異なるオブジェクトが同じことはありませんが、私は彼らの特定の特性の面で意味)似ているが同一ではないになります。
はい、違いが見つかりました。彼らは異なるプロトタイプを持っています。 –
プロトタイプの違い以外に実用的な違いはあまりありませんが、最初のオブジェクトではプロトタイプに何も付いていないので何もしません。 – Pointy
あなたはFooをクラスとして見ることができますが、Barはオブジェクトです –