公式サイトから読み取れる事
- マウスの代りになるデバイスである
- iPodサイズでUSBでコンピューターに接続して使う
- 小売価格は69.99USドル
- 既存の3Dセンサーの100倍以上の精度
- MaxOS, Windows7, Windows8 に対応
今できる事
- プレオーダー (発送は 2012年12月か2013年1月)
- 開発者登録
Struct.configure({
// 全てのチェック無効化
'disable any check': true
});
Struct.define('Size', {
width: {type: 'number', cond: 'v >= 0'},
height: {type: 'number', cond: function(v){return v >= 0} /*same as ↑*/}
});
var size = Struct.create('Size', {
width: 0,
height: 0
});
Struct.define('Position', {
x: {type: 'number', nullable: false},
y: {type: 'number', nullable: false}
});
Struct.define('Size', {
width: {type: 'number', nullable: false, cond: 'v >= 0'},
height: {type: 'number', nullable: false, cond: 'v >= 0'}
});
Struct.define('Rect', {
pos: {type: 'struct:Position', nullable: false},
size: {type: 'struct:Size', nullable: false},
createdAt: {type: 'date', writable: false}
});
var rect = Struct.create('Rect', {
pos: {x: 0, y: 0},
size: {width: 100, height: 100},
createdAt: new Date()
});
rect.pos.x = "200"; // => type mismatch error
rect.size.height = -1; // => condition formula validation error
function enableMethodMissing(obj) {
// 関数プロキシの作成
var functionHandler = createBaseHandler({});
functionHandler.get = function(receiver, name) {
// プロパティアクセスの場合は何も返さない
return function(){};
}
var calledProperty;
var trapFn = Proxy.createFunction(functionHandler, function() {
// 実行の場合は obj.methodMissing を呼び出す
return obj.__noSuchMethod__(calledProperty, Array.prototype.slice.call(arguments));
});
// プロパティプロキシの作成
var propertyAccessHandler = createBaseHandler(obj);
propertyAccessHandler.get = function(receiver, name) {
if (obj[name]) {
return obj[name];
} else {
// 存在しないプロパティへのアクセスは関数プロキシを返す
calledProperty = name;
return trapFn;
}
}
return Proxy.create(propertyAccessHandler);
// (略)
method_missing用の関数をわざわざProxy.createFunctionしているのは、プロパティアクセスの時はundefinedを返す、関数呼び出しの時はmethod_missing用の関数実行と処理を分けるため。> typeof(Proxy); // => object > typeof(Proxy.create); // => function
obj = {};
obj.hogeFuga = new Foo();
// do something
obj.hoge_fuga = null; // 不要になったので解放 (タイプミス)
といった、動かしてもすぐには気づきにくいミスに例外を投げてくれる。Object.seal でも良いけど、未定義プロパティのreadに対しては何もしてくれないのが不満だったので、それも例外が飛ぶようにした。// 構造体の定義
Struct.define('Position', {
x: {type: 'number'},
y: {type: 'number'}
});
Struct.define('Square', {
name: {type: 'string', writable: false},
pos: {type: 'struct:Position'},
hidden: {type: 'boolean'}
});
// 作成
var sq = Struct.create('Square', {
name: 'mySquare',
hidden: true
});
// 通常のObjectと同様に扱える
sq.pos = Struct.create('Position', {x: 10, y: 20});
sq.hidden = false;
console.log(sq.name); // => mySquare
console.log(sq.pos.x); // => 10
// 以降の操作は全てチェックエラー
var name = sq.Name; // 未定義プロパティの読み取り
delete sq.Name; // 未定義プロパティのdelete
sq.visible = true; // プロパティの追加
sq.pos.x = "100"; // 型の不一致
sq.name = "hoge"; // 読み取り専用プロパティの変更
動作にはECMAScript 6 のProxyが必要なので、Firefox or 設定をいじったChromeじゃないと動かない。しかしProxyが無くても例外が飛ばないだけなので問題は無い、開発時にエラーが飛んでくれればそれで良いと考えているので。