2012-04-26 8 views
3

javascript関数を呼び出すときと新しいキーワードを付けたときとで違いがありますか?たとえば、私は機能があった場合:Javascript新しいキーワードの使用

function computer(){ 
    this.hardDrive = "big"; 
    this.processor = "fast"; 
} 

をし、私は、2つの異なる方法でそれを呼び出す:

var hp = computer(); 
var hp = new computer(); 

は、2回の関数呼び出しの間の差であることを何が起こっていますか?

+1

[JavaScriptの 'new'キーワードは何ですか?](http://stackoverflow.com/questions/1646698/what-is-the-new-keyword-in-javascript)と[JavaScriptの新しいキーワード有害だと思っていますか?](http://stackoverflow.com/questions/383402/is-javascript-s-new-keyword-considered-harmful)および[新しいものの代わりにObject.createを使う](http://stackoverflow.com/質問/ 2709612/using-object-create-new-instead-of-new) – Phrogz

+0

関連項目[{}またはnew Object()を使用したJavaScriptでの空のオブジェクトの作成?](http://stackoverflow.com/questions/251402/create空のオブジェクト内のオブジェクト、または新しいオブジェクトを持つjavascript)。 – Phrogz

答えて

8

newがない場合、thisはグローバルオブジェクトを指し、関数から返されるオブジェクトはありません。

コードを実行する場合、最初のhpundefinedとなり、2番目のコードは[object Object]となります。さらに、明白な理由から、第1のものはhardDriveまたはprocessorのプロパティを持たないが、第2のものはそうではない。

最初の例では、2つのプロパティがwindowオブジェクトに追加されていました。

+1

最初のケース( 'new'はありません)の' this'は 'window'グローバルオブジェクトですか?この関数を実行すると 'hardDrive'と' processor'がグローバルオブジェクトに追加されますか? – Joseph

+1

全くありません。 ECMA-262は[実行コンテキスト](http://es5.github.com/#x10.3)を定義していますが、これはその単語が使用される唯一のコンテキストです。実行コンテキストは、すべてのローカル変数、パラメータ、スコープチェーンなどから構成され、* this *を含みます。 * this *が呼び出しによって設定された値は、呼び出しが行われた実行コンテキストや呼び出しによって作成された関数コンテキストとはまったく関係ありません。あなたが知っているのは、グローバルコードでは、* this *はグローバルオブジェクトを参照していることだけです。それ以外のコンテキストでは、グローバルオブジェクトを含む(ほとんど)何かを参照できます。 – RobG

1

newを使用しない最初のウィンドウは、ウィンドウオブジェクトを参照してthisで実行されます。 2番目はnewを使用して新しい空のオブジェクトを作成し、そのオブジェクトは関数内でthisになります。

関連する問題