読者です 読者をやめる 読者になる 読者になる

不思議の国の言語

この前、本屋に立ち読みしていたんですが、その本にECMAScriptのフリガナが【エクマスクリプト】ってうってあってそうだったんだ!と感銘を受けました。イーシーエムエーかと思っていました。
JavaScriptと他の言語(まぁ全ての言語とか比較したわけではないのでJavaとかPHPとかその辺のWEB関係のオブジェクト指向を取り入れている言語の話で…)。一般的なOOな言語はOO専用のキーワードを言語仕様として定義してそれを利用することでOOPを実現している。JavaScriptはOOなキーワードを設けず(あってもprototypeやnewくらい)に、OOPJavaScriptはその書き方によって実現することができる。

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では実装がそうさせているようなきがする。