旧それなりブログの跡地、画像やスタイルやJSなどが壊れてることがあります。

[JS] 無名関数にInterfaceを持たせる

2008年1月17日

久々にJavaScript!

無名関数の引数の型にInterfaceを持たせられる
Functionオブジェクトのインスタンスメソッドを書いてみました。

なんでいきなり?なのかというと、
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 って、ダイナミック・スコープの変数だったんだということをはじめて認識した。
うーん、知らないことだらけだなぁ・・・。