18323


**コンストラクに書いたnewする前のthisは、どこに所属しているのでしょうか？(どこを参照しているのでしょうか？)**  
・ただ関数定義しただけでは呼び出せないので、どこにも所属していない？  
・もしくは、呼び出し方によって変わるから、それまではどこにも所属できない？

[code]

    function Hoge() {
      this.p = 'テスト';
      console.log(this);
    }
    
[/code]

* * *

・関数定義した時点で既に、thisはwindow？

[code]

    window.p; //undefined
    Hoge.p; //undefined
    
[/code]

* * *

・普通に関数呼出しするとthisはwindow

[code]

       function Hoge() {
          this.p = 'テスト';
          console.log(this);
       }
       Hoge(); //Window
       window.p; //テスト
       this.p; //テスト
    
[/code]


CC BY-SA 3.0
2015-11-02T07:20:10.230
18320
2015-11-02T09:07:13.870
7886
question
javascript
「new演算子」や「関数として呼び出す」前の「コンストラクタ内this」はどこに所属？


おっしゃる通り、thisが指す物は呼び出し方によって変わります。  
(this は変数ではなくキーワードなので所属、というかスコープのような物は無いと思います)

### 関数呼び出し

> ・普通に関数呼出しするとthisはwindow

これは strictモードか否かによって変わります。

[code]

    function Hoge(){
        "use strict";
        return this;
    }
    Hoge();
    // -> undefined
    
[/code]

上記のように strictモードでは this は undefined です。非strictモードではグローバルの this (ブラウザでは
window)になります。

### メソッド呼び出し

[code]

    function Hoge(){
        return this;
    }
    obj = {a: 1, b: 2, hoge: Hoge};
    obj.hoge();
    // -> obj
    
[/code]

他のオブジェクトのメソッドとして呼び出されると、this はその呼び出しに使ったオブジェクトになります

### `call`や`apply`による呼び出し

[code]

    function Hoge(){
        return this;
    }
    obj = {a: 1, b: 2};
    Hoge.call(obj);
    // -> obj
    Hoge.apply(obj);
    // -> obj
    
[/code]

call と apply は this のオブジェクトを何にして実行するか指定して、関数を呼び出します。

## new による呼び出し

[code]

    function Hoge(){
        this.p2 = "set in Hoge";
    }
    Hoge.prototype.p = "set in prototype";
    new_obj = new Hoge;
    new_obj.p;
    // -> "set in prototype"
    new_obj.p2;
    // -> "set in Hoge"
    
[/code]

new は 新しいオブジェクトを作ります。  
そのオブジェクトのプロトタイプには、与えられた関数オブジェクトの「prototypeプロパティ」が設定されます。  
そして、this はその新しいオブジェクトになります。

### 注意

> ・関数定義した時点で既に、thisはwindow？
>
> window.p; //undefined  
>  Hoge.p; //undefined

Hogeのプロパティである`Hoge.p`は Hoge関数の定義内の this.p とは関係ありません。  
Hogeにプロパティを追加するには、

[code]

    Hoge.p = 1;
    
[/code]

のようにします。このように代入しても、もちろん this.p には何の影響もありません。


CC BY-SA 3.0
2015-11-02T09:07:13.870
18323
2015-11-02T09:07:13.870
3054
18320
answer