argius note

プログラミング関連

JavaScript再入門

第2次ブラウザ戦争以前、不完全に習得していたJavaScript
今回、HTMLになるべく手を入れずにWeb画面の見栄えや振る舞いを変える必要があったため、最近のテクニックなどをちょっと調べました。


まだprototype.jsとかjQueryとか、じっくり見たことはありません。あ、jQueryは本を読んでますね。けどよく覚えていません。無意識に覚えている可能性はあります。
いくつかの解説サイトを渡り歩きましたが、自分の中で元の情報と併せて整理し直して、それを元にサンプルを書いてみました。


今回は、WSHを使ってコマンドラインで実行しています。

// main.js

function echo(message) { WScript.Echo(message) }
function defineClass(def) { var ctor = def[""]; ctor.prototype = def; /* delete def[""]; */ return ctor }

var A = defineClass({
    "": function(name) {
        this.name = name;
        return this;
    },
    invoke: function() { echo("A.invoke, name=" + this.name) }
});

var a = new A("aaa");
var b = new A("bbb");
b.invoke = function() { echo("--- b.invoke, name=" + this.name) };

a.invoke();
b.invoke();

delete b.invoke;

a.invoke();
b.invoke();

var c = a[""]("ccc");
c.invoke();

頭のところで2つ関数を定義しています。
ひとつは、標準出力をラップするecho関数。これは、WSH固有の"WScript.Echo"を括り出しています。
もうひとつは、クラスをクラスベースっぽく(?)宣言できるようにする関数。空文字のメソッドは、コンストラクタにしてます。わざとメンバに残しているので、普通にメソッドで呼び出せてしまっています。


実行は、Cygwinで以下のようにしました。WSHのロゴが出力されないようにしています。

$ alias js="cscript //Nologo"
$ js main.js
A.invoke, name=aaa
--- b.invoke, name=bbb
A.invoke, name=aaa
A.invoke, name=bbb
A.invoke, name=ccc
$