2016-04-08 7 views
3
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__オブジェクトが見つかりました:

+1

はい、違いが見つかりました。彼らは異なるプロトタイプを持っています。 –

+0

プロトタイプの違い以外に実用的な違いはあまりありませんが、最初のオブジェクトではプロトタイプに何も付いていないので何もしません。 – Pointy

+0

あなたはFooをクラスとして見ることができますが、Barはオブジェクトです –

答えて

-1

最初のものは、関数オブジェクトを(Fooに割り当てられているもの)を出力する関数コンストラクタであり、他方は単純ですjavascriptオブジェクト。

+0

あなたはコンストラクタが 'new'演算子を介して**呼び出されているという事実を見逃しました。 – Pointy

+0

@Pointy私は彼が微妙に "関数コンストラクタ"を暗示していると思いますが、正確であることは素晴らしいでしょう –

+0

@Ji_in_coding Fooは単なるオブジェクトです。それは関数ではなく、コンストラクタではありません。 – Pointy

-1

すべての機能はオブジェクトです。あなたの場合、FooとBarは同じですが、最初のものを構築できます。同じトークンに

、私はこの場合はコンストラクタ関数とキーの洞察力は、我々が持っている場合ということだと思います。その後、

function myFoo(){ 
    this.A = 1; 
    this.B = 2; 
}; 

var Foo1 = new myFoo(); 

この文脈がfooであります。

var Foo2 = myFoo(); 

このこの場合のwindowオブジェクトは、(あなたが実際にwindow.A = 1を持っているという意味)、現在のコンテキストにバインドされます。

さらに詳しい説明は、MDNのドキュメントを参照してください。

Function

Constructor

new operator

+0

答えは正しいですが、この場合、FooもBarも関数ではありません。どちらもオブジェクトです。 – Pointy

+0

新しい関数(){}、新しい関数ではありません(){}()。 – djechlin

+1

@djechlin '()'はオプションです! – Pointy

-1

まずノート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は、その内部のプロトタイプオブジェクトであるオブジェクトです。

+0

'car1'のプロトタイプは、' Car'自身のものではなく、 'Car'の' prototype'プロパティの値になります。 – Pointy

0

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はそのプロトタイプチェーン内の余分な空のオブジェクトを持っているので
  • FooBarは(まあ、2つの異なるオブジェクトが同じことはありませんが、私は彼らの特定の特性の面で意味)似ているが同一ではないになります。
関連する問題