JavaScript(ECMAScript)の仕様書はPDFで入手可能だ。
少し使ったことがあれば、大体の雰囲気はつかめているはずなので、おそらく一番理解しにくそうだと思われる、プロトタイプベースのオブジェクト指向のための機能を中心に見ていくことにする。(拙訳、意訳・抄訳あり)
言語の概要 : 4.2 Language Overview
An ECMAScript object is an unordered collection of properties each with zero or more attributes that determine how each property can be used ECMAScriptにおけるオブジェクトひとつひとつの実体は、複数の「プロパティ」の順不同の集まりである。 そのプロパティのそれぞれに、そのプロパティの使われ方を決める属性がいくつかつけられていることもある。
つまり、JavaScriptのオブジェクトをJAVA的に書くとこんな感じ。
class JSProperty {
JSObject value;
JSAttribute[] attributes;
}
class JSObject {
Map<JSProperty> map;
}
プロトタイプ : 4.2.1 Objects
オブジェクトの説明であるが、JAVAやRubyなどをやってきた人にとっては(したがって、自分にとっては)最初の難関だと思われる。
ECMAScriptは、prototypeという概念によって継承を実現しているということで、その説明。
- ECMAScriptには、JAVA等と同じような意味でのクラスは存在しない。
- その代わりに、関数オブジェクトに対してnewキーワードを使うことにより、オブジェクトを生成する仕組みがある。
いったん仕様書を離れて考察。
関数オブジェクト
function f1() { log('aaa'); }
var f2 = function() { log('aaa') };
f1(); // aaa
f2(); // aaa
ここでf1とf2は、厳密には違うらしいが、実際上ほとんど同じような効果を持っており
f2のように、関数オブジェクトを定義して変数に代入することができるのがわかる。
var f3 = function() { log('ccc') };
var instance = new f3();
上のf3は、f2と同じただの関数だが、newキーワードを使うことでコンストラクタとして機能している。
class f3 extends JSObject {
f3() {
map.put(JSInternalProperties.CONSTRUCT, new JSFunction(" log ('aaa') ");
}
}
prototypeについて(未稿)
var Animal = function() {};
var Dog = function() {};
Dog.prototype = Animal;
prototypeの挙動
class JSObject {
public JSValue get(JSKey key) {
if (null != this.prototype && null != this.prototype.get(key)) {
return this.prototype.get(key);
} else {
return this.map.get(key);
}
}
public void put(JSKey key, JSValue value) {
this.map.put(key, value);
}
}
JavaScript2.0 (ECMAScript4, ActionScript3)
AdobeのFlash CS3, Flex2, MicrosoftのJScript.NETなどで採用されている。
ここまで述べてきたJavaScript1.x系とは、大きく変わっている。
まず基本的に、プロトタイプベースではなく「普通の」クラスベースのオブジェクト指向になっている。
つまりJAVAとほとんど同じようなコードスタイルになる。
package {
class Animal {
public function Animal():void {}
}
class Dog extends Animal {
public function Dog():void { super(); }
}
}
コメント
これ以降は広告であり本文とは一切関係ありません。