[JS] 無名関数にInterfaceを持たせる
2008年1月17日
久々にJavaScript!
無名関数の引数の型にInterfaceを持たせられる
Functionオブジェクトのインスタンスメソッドを書いてみました。
なんでいきなり?なのかというと、
Colin Moock会でECMAScript4で、以下のように各種変数の型を宣言できる
typeキーワードが設定される予定という話を聞きまして
Colin Moock会でECMAScript4で、以下のように各種変数の型を宣言できる
typeキーワードが設定される予定という話を聞きまして
type var foo = [int]; // 要素の値をint型に決める
確かに、引数として関数を渡すときや、複雑なデータ構造のハッシュとかは
型指定が出来る構文は欲しいなー、ということに気付いたので。
じゃあ、現仕様でも出来るところまでやろうと、
とりあえずは無名関数にInterfaceを持たせてみようと思いました。
前置きが長くなりましたが、簡単に書くとこんな感じ
Function.prototype.bindInterface = function(){ var types = arguments; var self = this; return function(){ for (var i = 0; i < types.length; i++) if (typeof arguments[i] !== types[i]) throw "argument type error."; return self.apply(this, arguments); }; };
こんな風に使う
var foo = function(a, b){ alert(a); alert(b); }; var f = foo.bindInterface("string", "number"); f("a", 2); // -> "a", 2 f(1, 2); // -> エラー f("a", "b"); // -> エラー
arrayとかnullとかundefinedとかNaNとかInfinityとかに対応したり
"string"はnullとundefinedを許容するけど、"string!"は許容しない(E4パクり)とか
そういう風にしたら、使えなくもないんじゃないでしょうか?
後、arguments って、ダイナミック・スコープの変数だったんだということをはじめて認識した。
うーん、知らないことだらけだなぁ・・・。
うーん、知らないことだらけだなぁ・・・。