funとmethodの違い
Xtalでは関数生成を「fun」、そしてメソッドの生成を「method」で行います。
JavaScript等では、普通の関数生成もメソッドの生成も全て同じ「function」でおこないます。
Xtalが分かれている理由、それは「this」の扱いのためです。
「fun」で関数を作った場合、「this」はその関数を作ったときの「this」が束縛され、その関数をいつ実行しても同じ「this」が使われます。
一方、「method」で関数を作った場合、「this」は束縛されず、関数の呼び出し元が暗黙的に渡す「this」が使われます。
例えば
obj.foo();
という呼び出しで、foo内のthisの扱いは
- fooがfunな場合、foo関数が定義されたときのthisがthisとなり
- fooがmethodな場合、objがthisとなります。
foo(); Bar::foo();
という呼び出しで、foo内のthisの扱いは
- fooがfunな場合、foo関数が定義されたときのthisがthisとなり
- fooがmethodな場合、関数呼び出し元のthisがthisとなります。
この呼び出しもとのthisがthisとして使われる機能があるからこそ、スーパークラスのメンバ関数を呼ぶとき、
Super: class{ foo: method(){ } } Sub: class(Super){ foo: method(){ Super::foo(); } }
というように書けるわけです。
JavaScriptでは、これを綺麗に書く方法がなく、小細工を弄する必要があります。