SlideShare una empresa de Scribd logo
1 de 25
Descargar para leer sin conexión
def.js をひも解く
~オレ標準 js 記法~
     id:mooz
   @stillpedant
自己紹介
• 名前
 – mooz (Hatena, GitHub, …)
 – stillpedant (Twitter, Google)
• 好きな言語
 – Mozilla 系 JavaScript
• 作ったもの                                      近影
 – KeySnail (Emacs 版 Vimperator)
 – MiSPLi (Lisp 処理系 in JavaScript)
 – その他もろもろ

            詳しくは http://mooz.github.com/index-ja.html で
def.js
def.js
• http://github.com/tobeytailor/def.js
• Ruby に似た記法でクラス定義と継承が行える
サンプルコード
サンプルコード




          !?
説明

• def (クラス名) (定義);
  – クラス定義
  – def ("Person") ({ … });
• def (クラス名) << 親クラス(定義);
  – 親クラスを指定したクラス定義 (継承)
  – def (“Ninja") << Person({ … });
• this._super();
  – メソッド中から用いる
  – 親クラスの同名メソッドを呼び出し
サンプルコード (再掲)
今回のスライドの目的
• def.js の挙動を理解する

• def (クラス名) (定義);
• def (クラス名) << 親クラス(定義);
• this._super();
def (クラス名) (定義);
def (クラス名) (定義);
• def 関数は関数 (deferred) を返す
• def(“Person”) とすると
  – Person クラスが作成され (window.Person が
    定義される)
  – 「定義 (props) を使って Person クラスを拡
    張する関数」が返る
• つまり def(“Person”)({ … }); とすると
  – Person クラスが定義され, { … } を使ってその
    クラスが拡張される

     ※ “拡張” : メソッドやプロパティを定義すること
def (クラス名) << 親クラス(定義);
def (クラス名) << 親クラス(定義);
• 前述の通り def 関数は関数 deferred を返す
• この関数には valueOf というプロパティが設定
  されている
• この valueOf がミソ
valueOf
• オブジェクトをプリミティブ値に変換する際に
  呼ばれる
• プリミティブ値が期待される場面にオブジェク
  トが出くわしたとき自動的に呼ばれる
valueOf の挙動




実行すると,
1.   def(foo) called
2.   def(bar) called
3.   foo (valueOf)
4.   bar (valueOf)
def (クラス名) << 親クラス(定義);
• def 関数は valueOf の設定された関数 deferred
  を返す
• def (クラス名) << 親クラス(定義); とすると合
  計で 3 回関数が呼ばれる


               def (クラス名)




               親クラス(定義)



              dererred.valueOf
               (def の返り値)
def(“Ninja”) << Person({ … });
 def(“Ninja”) << Person({ … }); としたとき……

        def(“Ninja”)

    1. Ninja クラスを作成
    2. deferred.valueOf を設定
    3. deferred を返す                      def.js のコンテキスト内でグローバル

                       _super, _props を設定          deferred

       Person({ … });               def(“Ninja”) の返した deferred に valueOf が
                                    設定されているので……
1. deferred の _super に Person を設定
2. deferred の _props に { … } を設定

                                                deferred.valueOf

             1. deferred の _props を使い Ninja クラスを拡張
             2. deferred の _super を使い Ninja の親クラスを Person に設定
                (Ninja に _superClass プロパティを設定する)
つまりは……
• A() 演算子 B() のとき
  1. A()
  2. B()
  3. A の返したオブジェクトの valueOf
• という順番で呼ばれてくれれば何でも良い
• << である必要性は無い
  – def(“Ninja”) >> Person({ … });
  – def(“Ninja”) + Person({ … });
this._super();
_super();




• 関数の caller プロパティを使って _super の呼び出し元
  メソッドを取得.
• メソッドの _class プロパティによりクラスを取得
• クラスの _super プロパティにより親クラスを取得
• メソッドの _name プロパティによりメソッドの名前を
  取得し, 親クラスの持つ同名メソッドを呼ぶ
_super() の使う各プロパティ
• Klass.extend 時に追加
  – メソッドの _name
  – メソッドの _class
• deferred.valueOf により追加
  – クラスの _super
• JavaScript 標準
  – arguments.callee
     • その関数自身
• JavaScript 非標準 (ほぼ全てのブラウザが実装)
  – caller プロパティ
     • その関数を呼んだ関数
まとめ
まとめ
• def (クラス名) (定義);
  – 関数を返す関数
• def (クラス名) << 親クラス(定義);
  – valueOf
  – << である必要なし
• this._super();
  – arguments.callee.caller
演算子オーバーロード欲しい
資料
• def.js
   – http://github.com/tobeytailor/def.js
• 日本語の解説コメントをつけたコード
   – https://gist.github.com/2ac889f4b0276ddf9586




               ご静聴ありがとうございました

Más contenido relacionado

Destacado (7)

ICDE 2015 Study (R24-4, R27-3)
ICDE 2015 Study (R24-4, R27-3)ICDE 2015 Study (R24-4, R27-3)
ICDE 2015 Study (R24-4, R27-3)
 
ES Harmony Proxy on Firefox 4
ES Harmony Proxy on Firefox 4ES Harmony Proxy on Firefox 4
ES Harmony Proxy on Firefox 4
 
OSC 2011 KeySnail
OSC 2011 KeySnailOSC 2011 KeySnail
OSC 2011 KeySnail
 
Rios::Proxy - A framework for CLI
Rios::Proxy - A framework for CLIRios::Proxy - A framework for CLI
Rios::Proxy - A framework for CLI
 
ES.next WeakMap
ES.next WeakMapES.next WeakMap
ES.next WeakMap
 
研究動向から考えるx86/x64最適化手法
研究動向から考えるx86/x64最適化手法研究動向から考えるx86/x64最適化手法
研究動向から考えるx86/x64最適化手法
 
BlinkDB 紹介
BlinkDB 紹介BlinkDB 紹介
BlinkDB 紹介
 

Similar a defjs をひも解く

Similar a defjs をひも解く (9)

Java研修 継承
Java研修 継承Java研修 継承
Java研修 継承
 
Lispmeetup #53 PythonベースのLisp方言、 Hyのすすめ
Lispmeetup #53 PythonベースのLisp方言、 HyのすすめLispmeetup #53 PythonベースのLisp方言、 Hyのすすめ
Lispmeetup #53 PythonベースのLisp方言、 Hyのすすめ
 
Xtend の紹介
Xtend の紹介Xtend の紹介
Xtend の紹介
 
Grails 2.0.0.M1の話
Grails 2.0.0.M1の話 Grails 2.0.0.M1の話
Grails 2.0.0.M1の話
 
Everyday Life with clojure.spec
Everyday Life with clojure.specEveryday Life with clojure.spec
Everyday Life with clojure.spec
 
Ruby 初級者向けレッスン 49回───クラス
Ruby 初級者向けレッスン 49回───クラスRuby 初級者向けレッスン 49回───クラス
Ruby 初級者向けレッスン 49回───クラス
 
葉物野菜を見極めたい!by Keras
葉物野菜を見極めたい!by Keras葉物野菜を見極めたい!by Keras
葉物野菜を見極めたい!by Keras
 
pi-12. 時間, スリープ, 疑似乱数, タイマー
pi-12. 時間, スリープ, 疑似乱数, タイマーpi-12. 時間, スリープ, 疑似乱数, タイマー
pi-12. 時間, スリープ, 疑似乱数, タイマー
 
Shibuya.lisp #28: 仮題: R について
Shibuya.lisp #28: 仮題: R についてShibuya.lisp #28: 仮題: R について
Shibuya.lisp #28: 仮題: R について
 

Último

Último (11)

Observabilityは従来型の監視と何が違うのか(キンドリルジャパン社内勉強会:2022年10月27日発表)
Observabilityは従来型の監視と何が違うのか(キンドリルジャパン社内勉強会:2022年10月27日発表)Observabilityは従来型の監視と何が違うのか(キンドリルジャパン社内勉強会:2022年10月27日発表)
Observabilityは従来型の監視と何が違うのか(キンドリルジャパン社内勉強会:2022年10月27日発表)
 
知識ゼロの営業マンでもできた!超速で初心者を脱する、悪魔的学習ステップ3選.pptx
知識ゼロの営業マンでもできた!超速で初心者を脱する、悪魔的学習ステップ3選.pptx知識ゼロの営業マンでもできた!超速で初心者を脱する、悪魔的学習ステップ3選.pptx
知識ゼロの営業マンでもできた!超速で初心者を脱する、悪魔的学習ステップ3選.pptx
 
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
 
Utilizing Ballerina for Cloud Native Integrations
Utilizing Ballerina for Cloud Native IntegrationsUtilizing Ballerina for Cloud Native Integrations
Utilizing Ballerina for Cloud Native Integrations
 
LoRaWANスマート距離検出センサー DS20L カタログ LiDARデバイス
LoRaWANスマート距離検出センサー  DS20L  カタログ  LiDARデバイスLoRaWANスマート距離検出センサー  DS20L  カタログ  LiDARデバイス
LoRaWANスマート距離検出センサー DS20L カタログ LiDARデバイス
 
新人研修 後半 2024/04/26の勉強会で発表されたものです。
新人研修 後半        2024/04/26の勉強会で発表されたものです。新人研修 後半        2024/04/26の勉強会で発表されたものです。
新人研修 後半 2024/04/26の勉強会で発表されたものです。
 
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアルLoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
 
論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...
論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...
論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...
 
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
 
論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding
論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding
論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding
 
論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games
論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games
論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games
 

defjs をひも解く

  • 1. def.js をひも解く ~オレ標準 js 記法~ id:mooz @stillpedant
  • 2. 自己紹介 • 名前 – mooz (Hatena, GitHub, …) – stillpedant (Twitter, Google) • 好きな言語 – Mozilla 系 JavaScript • 作ったもの 近影 – KeySnail (Emacs 版 Vimperator) – MiSPLi (Lisp 処理系 in JavaScript) – その他もろもろ 詳しくは http://mooz.github.com/index-ja.html で
  • 4. def.js • http://github.com/tobeytailor/def.js • Ruby に似た記法でクラス定義と継承が行える
  • 7. 説明 • def (クラス名) (定義); – クラス定義 – def ("Person") ({ … }); • def (クラス名) << 親クラス(定義); – 親クラスを指定したクラス定義 (継承) – def (“Ninja") << Person({ … }); • this._super(); – メソッド中から用いる – 親クラスの同名メソッドを呼び出し
  • 9. 今回のスライドの目的 • def.js の挙動を理解する • def (クラス名) (定義); • def (クラス名) << 親クラス(定義); • this._super();
  • 11. def (クラス名) (定義); • def 関数は関数 (deferred) を返す • def(“Person”) とすると – Person クラスが作成され (window.Person が 定義される) – 「定義 (props) を使って Person クラスを拡 張する関数」が返る • つまり def(“Person”)({ … }); とすると – Person クラスが定義され, { … } を使ってその クラスが拡張される ※ “拡張” : メソッドやプロパティを定義すること
  • 12. def (クラス名) << 親クラス(定義);
  • 13. def (クラス名) << 親クラス(定義); • 前述の通り def 関数は関数 deferred を返す • この関数には valueOf というプロパティが設定 されている • この valueOf がミソ
  • 14. valueOf • オブジェクトをプリミティブ値に変換する際に 呼ばれる • プリミティブ値が期待される場面にオブジェク トが出くわしたとき自動的に呼ばれる
  • 15. valueOf の挙動 実行すると, 1. def(foo) called 2. def(bar) called 3. foo (valueOf) 4. bar (valueOf)
  • 16. def (クラス名) << 親クラス(定義); • def 関数は valueOf の設定された関数 deferred を返す • def (クラス名) << 親クラス(定義); とすると合 計で 3 回関数が呼ばれる def (クラス名) 親クラス(定義) dererred.valueOf (def の返り値)
  • 17. def(“Ninja”) << Person({ … }); def(“Ninja”) << Person({ … }); としたとき…… def(“Ninja”) 1. Ninja クラスを作成 2. deferred.valueOf を設定 3. deferred を返す def.js のコンテキスト内でグローバル _super, _props を設定 deferred Person({ … }); def(“Ninja”) の返した deferred に valueOf が 設定されているので…… 1. deferred の _super に Person を設定 2. deferred の _props に { … } を設定 deferred.valueOf 1. deferred の _props を使い Ninja クラスを拡張 2. deferred の _super を使い Ninja の親クラスを Person に設定 (Ninja に _superClass プロパティを設定する)
  • 18. つまりは…… • A() 演算子 B() のとき 1. A() 2. B() 3. A の返したオブジェクトの valueOf • という順番で呼ばれてくれれば何でも良い • << である必要性は無い – def(“Ninja”) >> Person({ … }); – def(“Ninja”) + Person({ … });
  • 20. _super(); • 関数の caller プロパティを使って _super の呼び出し元 メソッドを取得. • メソッドの _class プロパティによりクラスを取得 • クラスの _super プロパティにより親クラスを取得 • メソッドの _name プロパティによりメソッドの名前を 取得し, 親クラスの持つ同名メソッドを呼ぶ
  • 21. _super() の使う各プロパティ • Klass.extend 時に追加 – メソッドの _name – メソッドの _class • deferred.valueOf により追加 – クラスの _super • JavaScript 標準 – arguments.callee • その関数自身 • JavaScript 非標準 (ほぼ全てのブラウザが実装) – caller プロパティ • その関数を呼んだ関数
  • 23. まとめ • def (クラス名) (定義); – 関数を返す関数 • def (クラス名) << 親クラス(定義); – valueOf – << である必要なし • this._super(); – arguments.callee.caller
  • 25. 資料 • def.js – http://github.com/tobeytailor/def.js • 日本語の解説コメントをつけたコード – https://gist.github.com/2ac889f4b0276ddf9586 ご静聴ありがとうございました