JavaScript

String#succ

g:subtech:id:secondlife:20060530:1148996760 経由で p (1..n).inject(s) {|x,| x.succ}という表現を見てちょっと衝撃を受けました。"n" は数値、"s" は文字列で、n 回分文字列を succ する (C 言語系の "++" みたいなもの) 方法を表したものです。例えば n…

『livedoor Readerをはてブと合体』on IE

実は 東京嫉妬: livedoor Readerをはてブと合体 を初めて見たときから「IE でもできたらいいな〜」と思っていたんです。 最近になって id:reinyannyan:20060518:p1 等により IE でも Greasemonkey 並みのことが可能だと分かってきたということで、思い切って…

JavaScript の コンストラクタの戻り値

LDR のソースを見ていて一つ不思議に思ったんですが、 new MyClassとして返ってくるのは、普通はインスタンスですよね。ところが、そうではない使い方をしている箇所がありました。こんな形です: function Hello() { var hello = function () { alert("Hello…

"abc".x(2) -> "abcabc"

配列に続いて、文字列の乗算メソッドも実装してみましょう。ただし、全然違うアルゴリズムを用います。 String.prototype.x = function (x) { var base = this, result = ''; while (x) { if (x % 2) result += base; x = Math.floor(x / 2); base += base; …

[1,2,3].x(2) -> [1,2,3,1,2,3]

id:reinyannyan:20060427:p1 で、写真の額縁をランダムに五つ並べる、ということを表そうとしたんですが、 ['random', 'random', 'random', 'random', 'random']と書くのはあまりに格好悪いなと思いました。そこで、Ruby の配列の乗算メソッド (*) と同様の…

クラス版 DOM Iterator の利用例と解説

id:reinyannyan:20060411:p1 の後半で、DOM 要素コレクションを prototype.js 的にイテレーション可能にするクラス "Domi" (仮称) を実装しました。実装の動機については id:reinyannyan:20060404:p2 に述べたんですが、ここで改めてまとめておきましょう:Pr…

DOM 要素の集合のイテレーション (OO 版)

id:reinyannyan:20060404:p2 からの発展です。Update [20060412]:少しコードの見直しを行い、select の連結による多重絞込みを可能にしました (古い each の上に新しい each を次々と被せていくことで可能になりました。クロージャ万歳!)。 応用イテレータ…

AJAX で『はてなフォトライフデスクトップ』

Windows の、デスクトップの壁紙に HTML ファイルを指定できる機能 (Active Desktop) を利用して、はてなフォトライフデスクトップみたいなものを作ってみました。これまで XML を扱ったことがあまり無かったので難しいかなと思ったんですが、次々とインスピ…

DOM 要素の集合のイテレーション

Update: id:reinyannyan:20060411:p1 に続きます getElementsByTagName の様なメソッドで得られた、配列ではない要素集合を配列のように扱いたい時に、prototype.js では "$A" という関数によってまず配列化する、という方法を用います。これは非常に素晴ら…

prototype.js の Class 拡張試案: Class.extend

Prototype の拡張試案の一つとして、これまでにクラスの継承のための仕組み (Class.extend メソッド) を提唱してきました。これは、実際にはクラスのコンストラクタに割り当てられ、 MyClass = Class.create(); ... AnotherClass = MyClass.extend(...);とい…

コレクション、イテレータ、そして inject のパワー

注: これは Ruby のコードではありません (笑): var ibm = [ 'H', 'A', 'L' ].inject('', function (str, item) { return str + item.succ(); }); print(ibm); // -> 'IBM'いきなり結果からお見せしましたが、今回は難しいと言われている inject メソッドの…

prototype.js のクラス拡張: 仕様変更

prototype.js の Enumerable を自分のクラスで利用しようと思ったところ、幾つか問題にぶつかったため、以下の点を修正します。 include メソッドの名前変更 Mixin のための include メソッドが Enumerable のメソッドとカブることには元々気付いていました…

prototype.js と「プロトタイプ」

これまで私が prototype.js の拡張を行ってきた中で、JavaScript という言語に対する姿勢について明確に述べたことは無かったかも知れません (英語版では少し触れたんですが)。なので、いささか唐突ですが、ここで改めて (かつ少々乱暴に) 表してみようと思…

メソッドをプライベート化する実験

私が prototype.js に基づいた OO プログラミングをしていて度々思うのが、メソッドをプライベートにする方法が無いものだろうか、ということです。オーソドックスな、function 文を使用するクラス定義方法であれば、以下の様に関数を "this" と関連付けない…

Mozilla 系で arguments.caller が非推奨となっていた件

JavaScript 1.3 で arguments の caller プロパティーが非推奨とされていたことを知りました: http://docs.sun.com/source/816-6408-10/function.htm http://www.interq.or.jp/student/exeal/dss/ref/jscript/object/arguments.html現在の 1.5 では利用も出…

Singleton Pattern

昨日ご紹介した新たなクラス定義の手法を適用して、id:reinyannyan:20051015:1129356763 の Singleton Pattern の実装をアップデートしてみましょう。今回も prototype.js を利用した形です。シングルトン・クラス作成メソッド: Class.singleton = function …

prototype.js の Class 拡張試案について (仕様変更案)

Class.abstract と Class.concrete を統一すべきか id:reinyannyan:20051028:p1 等で Class.abstract() と Class.concrete() というクラス作成メソッドを提案しました。prototype.js で、抽象クラスを定義するのに空関数を使っているのがちょっと格好悪いな…

関数の実行を遅らせる (OO 的に)

関数を遅れて実行させたいなと思うことがたまにありますので、prototype.js にある bind メソッド*1に習って、再利用可能な形にしてみました: Function.prototype.delay = function (delay) { window.setTimeout(this, (delay * 1000)); };(最初に bind の実…

Ruby の kind_of? の実装

前の記事でさりげなく登場していたこの行 if (!comd.kind_of(Command.Abstract))について解説いたしましょう。Ruby には kind_of? というメソッドがあり、オブジェクトが、任意のクラスまたはそのサブクラスのインスタンスかどうかを調べます。"?" こそ付け…

Strategy Pattern ~ mixin を利用した

Command Pattern の話の続きです。最初にこのコマンド処理の仕組みを作った時、私はジョブ処理の方式として「キュー」を用いました。人の行列のイメージですね。最も長く待ったものが最初に処理されるという方式です。これでしばらくは満足だったんですが、…

Command Pattern 改定

前回のコマンド・パターンの記事のちょっとしたアップデートです。The Pragmatic Programmers が提唱する "Tell Don't Ask" の原則というものがあります。Java World にも同趣旨のコラムがあり、「オブジェクトに情報を尋ねるのではなく、情報を持っているオ…

Command Pattern

([20060226]: RSS リーダーの方にはご迷惑かもしれませんが、読み返してみて自分でもちょっと理解し辛かったので、ほんの少しだけ加筆・修正しました)先日の HTTP 通信の話 (id:reinyannyan:20060131:p1) の続きです。パターンの解説ではありません。パター…

getter/setter メソッド

オブジェクトの変数の状態について、「知る」・「設定する」の両方を行うメソッドを思いついたので、メモしておきます (まぁ多分良く知られてる方法なんだろうなとは思いますが)。 initialize: function () { this.__stack = false; }, prefer_stack: functi…

JS と私と HTTP 通信

現在、私は JavaScript を、主にウェブ上の定期的なメンテナンス作業のために利用しています。これは、Bloglines Notifier (id:reinyannyan:20051018:p1) の記事でご紹介したように、ウェブ・ページをタスクバー項目にできることを知っていたため、JavaScrip…

Ruby 的ブロック

昨日の NEWZingo の話からの発展です。大した意味は無いんですが、News cloud を表示した時に、自動的に最初のタグ (タグクラウドの意味でのタグです) にフォーカスを置くようにしたいと思ったんです。で、探すと focus というメソッドが見つかりました。さ…

JS におけるクラス定義とは

JS において、クラスは関数によって定義します。つまり、クラスと言っていますがそれは便宜的な表現であって、実際には関数オブジェクトという名のオブジェクトです。これが、オブジェクトのコンストラクタとなります: function MyClass() { this.property =…

JS におけるオブジェクトとは

周知の話の繰り返しとなってしまいますが、ちょっと基本に立ち返ってみたいと思います。JSON (JavaScript Object Notation) というものがあります。JS のオブジェクト記法に基づいたコード受け渡しの仕組みですが、ここではその記法そのものを見ていきます。…

prototype.js の Class 拡張試案 (3): Mixin

Update: 末尾に追記がありますid:reinyannyan:20051028:p1 で、Class.Methods というものを導入してみました。全てのオブジェクトでデフォルトのメソッドとして使えたら便利、というものをまとめておき、インスタンス生成時に自動的に組み込まれるように仕掛…

prototype.js の Class 拡張試案 (2): 継承とスーパークラスへのアクセス

(注意: この記事には幾つか問題点があります。次の記事 id:reinyannyan:20051118:p1 で修正しますので、そちらと併せてお読みください。)prototype.js は、JavaScript というプロトタイプ・ベースのオブジェクト指向言語 (クラスが存在しない = 全てがオブジ…

prototype.js の Class 拡張試案 (Main, Singleton etc.)

Update [20060301]: id:reinyannyan:20051118:p1 の末尾に修正点を追記しましたのでご覧下さい。 id:reinyannyan:20051015:1129388215 において、prototype.js の Object.prototype 汚染の問題を紹介させて頂きました。その文脈の中で、(コーディングの便の…