こういうのと同じですね。
functionのコンテキストが変わったので、thisにバインドされているものが変わったと言いますか。
javascript
1var c = function(){}
2c.x = function(){console.log(this.toString());}
3c.x();
4// "function (){}"
5var fx = c.x;
6fx();
7// "[object Window]"
8
9var d = function(){}
10var fy = function(){console.log(this.toString());}
11fy();
12// "[object Window]"
13d.y = fy;
14d.y();
15"function (){}"
https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Operators/this
のメソッドの束縛のところ。
ここからわかるように、bar は foo とは何のつながりもありません。オブジェクトは関数を参照するプロパティを持つ事が出来ますが、その関数はそのオブジェクトに所属 している訳ではありません。具体的に言うと、この関数内の this は getBrand の定義時に自動的に foo に置き換えられるわけではありません。そうではなく、this は関数の呼び出し元から与えられます。つまり、foo.getBrand() という式によって、foo が this として foo.getBrand に参照される関数に渡されるということです。
以下の様にbindしておけば、期待する結果となります。
javascript
1class Hoge{
2 get a(){
3 return "a";
4 }
5 get _func1(){
6 return this.func1.bind(this);
7 }
8 func1(){
9 console.log(this.a);
10 }
11 func2(){
12 console.log(this);
13 }
14}
15
16var h=new Hoge();
17h.func1();
18// a
19h.func2();
20// Hoge {}
21
22
23var flag=true;
24var f = h._func1;
25// h._func1によって、thisがhの状態で実行され、結果func1にhがbindされたものがfに入る。
26f();
27// a
28(flag?h.func1.bind(h):h.func2.bind(h))();
29// a
30var flag=false;
31(flag?h.func1:h.func2)();
32// undefined
33
34
35var f2 = h.func2;
36f2(); // undefined - ここでWindowでないのは私もまだきっちり説明できない
37window.f2(); // Window
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2016/08/20 01:03