soraなりの日々 - fc2 -

こころにひっかかったもの

[javascript]javascript で継承をやってみた!

今の業務でどうしても javascriptクラス作って、
クラス継承使わないとこれは生産性にも影響するし、
「どげんかせんといかんな」と思えるところがありましてですね。

今回、勉強したよ。

web 屋さんでガリガリっと書いたりする人には
常識なんだろけど、かれこれ5~6年前の javascript "しか"
知らない+根っこが c++ の oop の考え方"しか"できない
オイラには結構な苦行でした。

で、やっぱり備忘録で残しておく。

このエントリーをはてなブックマークに追加

まー、やりたかった事は c++ 的にはこんな感じ↓

#include <iostream>
#include <sstream>

using namespace std;

/**
 * 親クラス
 *
 */
class Parent
    {
public:
    Parent(string& str)
        {
        m_str = str;
        };
    virtual ~Parent() {};
public:
    void disp()
        {
        cout << this->m_str << endl;
        }
private:
    string m_str;
    };

/**
 * 子クラス
 *
 */
class Child : public Parent
    {
public:
    Child(string& str):Parent(str)
        {
        };
    ~Child() {};
    };

int main(void)
    {
    string str = "hello world.";
    Child child(str);
    child.disp();
    return 0;
    }

実行の結果はもちろん "hello world." が表示される。
(c++ 的 oop で、基底クラスとして作ったクラスのデストラクタに
 "virtual" と普通に書けるのかは結構分かれ目なところがありますね。
 ですよね。itose 氏(^^;)

で、これを javascript で書くとこうなる↓

/**
 * 親クラス
 *
 */
var Parent = function () {
  this.initialize.apply(this, arguments);
}

Parent.prototype = {

  initialize : function(_str) {
    this.str = _str;
  },

  disp : function() {
    alert(this.str);
  }
}

var Child = function () {
  this.initialize.apply(this, arguments);
}

Child.prototype = new Parent;
child = new Child('hello world.');
child.disp();


(子クラス側の宣言の仕方に悩まされたんよ・・・orz
 いや、ほんと。マジで。)

javascript継承の仕方にはいくつかあるみたいですが、
今回はプロトタイプによる継承でやってみた。
(若干、ここら辺がまだきちんと理解できてない。。。)

[[JavaScript]JavaScript継承パターンまとめ]
http://d.hatena.ne.jp/shogo4405/20070121/1169394889

動的言語継承した場合の違いとか、結構違和感があったんだけど、
今日会社の大先輩とやった javascript 勉強会で大分理解したかな。

で、javascript 大っ嫌いだったんだけど、ここら辺を若干だけど
理解して、「あー、それって賢いなー」とか思い出したら、結構
好きになれた。

javascript ほんと奥深いなー。。。
(まー、js の動的なクセを知るために頭の中で ruby で変換
 してやらないと考えきれないんだけどね。)

がんばってべんきょーしなきゃなー(ほぼ棒読み)

ん?で、生産性どうなったかって??
そら、あり得ないぐらいあがったがな!
oop の醍醐味っすわ(^^;
このエントリーをはてなブックマークに追加

コメント

コメントの投稿


管理者にだけ表示を許可する

トラックバック

トラックバックURLはこちら
http://sora2hs.blog70.fc2.com/tb.php/359-eb1aeffc
この記事にトラックバックする(FC2ブログユーザー)