不思議の国の言語
この前、本屋に立ち読みしていたんですが、その本にECMAScriptのフリガナが【エクマスクリプト】ってうってあってそうだったんだ!と感銘を受けました。イーシーエムエーかと思っていました。
JavaScriptと他の言語(まぁ全ての言語とか比較したわけではないのでJavaとかPHPとかその辺のWEB関係のオブジェクト指向を取り入れている言語の話で…)。一般的なOOな言語はOO専用のキーワードを言語仕様として定義してそれを利用することでOOPを実現している。JavaScriptはOOなキーワードを設けず(あってもprototypeやnewくらい)に、OOPをJavaScriptはその書き方によって実現することができる。
PHP5では
public、class、static、extends……。
<?php class Hoge { public $foo; private static $bar; public function Hoge(){} } class HogeHoge extends Hoge{} ?>
JavaScriptでは
HogeHoge.prototype = new Hoge()。慣用句の世界(一般的な継承の仕方。)
function Hoge(){}; function HogeHoge(); HogeHoge.prototype = new Hoge();
JavaScriptでprivateプロパティの実現
どこにもprivateがでてこないですが何か問題でも?
function Hoge() { var prop = { foo : "Hello World!!"; }; this.getValue = function(k){ return prop[k]; }; this.setValue = function(k, v){ prop[k] = v; }; this.display = function(){ alert(prop.foo); }; } hoge = new Hoge(); hoge.display(); // Hello World!! alert(prop); // ないって怒られる。
う〜ん
JavaScriptの書き方によってOOPができる。ということは自分なりの extends が定義できるということ。
function extend(s, c) { c.prototype = new s(); return c; } HogeHoge = extend(Hoge, function(){});
namespace = {}; namespace.superclass = function(){}; namespace.extend = function(s, c, p) { c.prototype = new this[s]; for(var i in p) c.prototype.[i] = p[i]; return c; }; namespace.foo = namespace.extend('superclass',function() { // alert("foo"); }, { text : 'Hello World!!' });
汎用的なextendも作成できるしある名前空間専用のextendを作成もできる。これって他の言語では仕様がそうさせ、JavaScriptでは実装がそうさせているようなきがする。