26 06 2011 javascript Tweet
行ってきた@富士のコミュニティf
配列かどうかの判定(6.5)
タイプがobjectで且つコンストラクタがArrayであるかという判定法ではグローバルオブジェクトで作成された配列を識別できない。
そこで次のような判定の関数を定義している
var is_array = function (value) { return value && typeof value === 'object' && typeof value.length === 'number' && typeof value.splice === 'function' && !(value.propertyIsEnumerable('length')); }
さて、この判定でtrueを返すような配列じゃないオブジェクトを作りたい。
読書会の時にはlengthプロパティを設定しつつ列挙不可能な状態にする方法がわからなかったが、朝プリキュアを見てたらふとプロトタイプチェーン上にlengthプロパティをおけばいいじゃんと気がついた。
var fake_ = {'length':3 }; var fake_array = {}; fake_array.__proto__ = fake_; fake_array.splice = function() { return 'Hello World'; } console.log(is_array(fake_array));
これはtrueを出力する
applyの分かりやすい適用事例(8)
apply,callはthisに値を自由にセット出来るので継承に頼らなくても自由にメソッドを実行出来るということだが、実例としてはどういう場合に使われているのかという話になった。自分は再帰でつかったくらいしかなかったなあとちょっと調べてみた。
- prototype.jsのbindメソッド
- jQueryにおけるapply
- DOMユーティリティ関数
- javascript - Array.prototype.slice.apply(arguments) // 引数一発配列化
他のライブラリなんかにある便利メソッドを自分のオブジェクトでちょっと利用したいって時か、(ライブラリ開発者が)コントロールできないユーザーのオブジェクトにメソッドを注入したいとかそういう時に使うのかな。
おやつと懇親会
おやつは杉山フルーツの生ゼリー
懇親会はうお菜