忍者ブログ

技術メモ

Home > ブログ > JavaScript

[PR]

×

[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。

JavaScriptクラス宣言

◆JavaScriptクラス宣言
◆プロトタイプ・ベースのオブジェクト指向
 
・JavaScriptでは関数オブジェクトにクラスとしての役割を与えている
・コンストラクタとは、オブジェクトを生成する際に
 自動的に呼び出される関数(メソッド)のこと
・本質的な違いはない、new演算子で呼び出すか、
 関数として呼び出すかの違う
・オブジェクト共通で利用するプロパティ(メンバ変数)などを
 定義するのがコンストラクタの役割
・インスタンスに追加したメンバは、
 (オブジェクト共通ではなく)そのインスタンスのみで有効である
 それぞれのインスタンスのためにメモリを確保す
・「プロトタイプ・ベースのオブジェクト指向」
 =単にクラスという抽象化された設計図が存在しない
 
 
//◆クラス定義(※コンストラクタに近い)
//・戻り値を返す必要がない
//・オブジェクトの初期化
var Animal = function() {};
 
//インスタンス作成
var anim = new Animal();
 
//◆プロパティ・メソッド宣言
//・thisキーワードは新たに生成されるオブジェクトを表す
//・値として関数オブジェクトが渡されたプロパティがメソッドと見なされる
var Animal = function(name, sex) {
   //プロパティ
  this.name = name;
  this.sex = sex;
  //メソッド
  this.toString = function() {
  window.alert(this.name + " " + this.sex);
}
var anim = new Animal("トクジロウ", "オス");
anim.toString(); // 「トクジロウ オス」
 
//◆メソッド追加
//・インスタンスに対して動的にメソッドを追加できる(動的性質)
//・インスタンスへのメソッドの追加は
// あくまでインスタンス(ここではanim)への追加
//・インスタンス、あるいはコンストラクタ経由で
// 追加したメンバはdelete演算子(後述)で削除することも可能
var Animal = function(name, sex) {
  this.name = name;
  this.sex = sex;
}
var anim = new Animal("トクジロウ", "オス");
anim.toString = function() {
  window.alert(this.name + " " + this.sex);
};
anim.toString(); // 「トクジロウ オス」
 
var anim2 = new Animal("リンリン", "メス");
anim2.toString(); // エラー発生
 
//◆プロトタイプ
//・コンストラクタでメソッドを追加するのは好ましいことではない
//・クラス(コンストラクタ)はインスタンスを生成する都度、
//・すべてのオブジェクトは「prototype」という名前のプロパティを公開している
//・prototypeプロパティは、デフォルトで何らプロパティを持たない
// 空のオブジェクト(プロトタイプ・オブジェクト)を参照している
//・ここで追加されたメンバは、そのままインスタンス化された先の
// オブジェクトに引き継がれる
//・関数オブジェクトをインスタンス化した場合、インスタンスは
// 基となる関数オブジェクトに属するprototypeオブジェクトに対して、
// 暗黙的な参照を持つことになる
var Animal = function(name, sex) {
  this.name = name;
  this.sex = sex;
}
 
Animal.prototype.toString = function() {
  window.alert(this.name + " " + this.sex);
};
 
var anim = new Animal("トクジロウ", "オス");
anim.toString(); // 「トクジロウ オス」
 
//◆プロトタイプ・オブジェクトを介する利点
//(1)必要なメモリ量を節約できる
//・プロトタイプに対する暗黙的な参照が利用されるのは、読み込みの場合だけ
//・この状態を、インスタンスa1のnameプロパティが
// プロトタイプ・オブジェクトのnameプロパティを
// 「隠ぺいする」といういい方をする場合もある。
//・この考え方はdelete演算子の場合でも同様
//・「delete Animal.prototype.name」のように記述すれば、
// プロトタイプ・オブジェクトのメンバを削除することも可能だ
//・undefined値でプロトタイプ・オブジェクトメンバを無効化することもできる
//(2)プロトタイプ・オブジェクトの変更はリアルタイムに認識
//・インスタンスを生成した「後」に、基となるプロトタイプ・オブジェクトに
// メンバを追加した場合にも、これを認識できる
 
var Animal = function() {};
 
Animal.prototype.name = "サチ";
var a1 = new Animal();
var a2 = new Animal();
 
window.alert(a1.name + "|" + a2.name); // 「サチ|サチ」
 
a1.name = "トクジロウ";
window.alert(a1.name + "|" + a2.name); // 「トクジロウ|サチ」
 
delete a1.name; // インスタンスa1のnameプロパティを削除
delete a2.name; // インスタンスa2のnameプロパティを削除
 
window.alert(a1.name + "|" + a2.name); // 「サチ|サチ」
 
//◆プロトタイプをオブジェクト・リテラルで定義する
//・リテラルとは、任意の式内に直接に記述可能なデータ値(表現)のこと
var Animal = function(name, sex){
  this.name = name;
  this.sex = sex;
}
 
Animal.prototype = {
  getVoice : function() {
    window.alert(this.name + "「チュウ!」");
  },
  toString : function() {
    window.alert(this.name + " " + this.sex);
  }
};
 
var anim = new Animal("トクジロウ", "オス");
anim.toString(); // 「トクジロウ  オス」
 
◆プロトタイプ・チェーン - JavaScriptの継承機構 -
//・継承関係を自由に変更可能
//・いったん形成されたプロトタイプ・チェーンは
// その後の変更にかかわらず保存される
----------------------------
var Animal = function() {}
Animal.prototype = {
  walk : function() {
    window.alert("トコトコ");
  }
};
 
var Hamster = function() {};
Hamster.prototype = new Animal();
 
Hamster.prototype.gnaw = function() {
  window.alert("ガジガジ…");
};
 
var ham = new Hamster();
ham.walk(); // 「トコトコ」 [A]
ham.gnaw(); // 「ガジガジ…」
----------------------------
var Animal = function() {}
Animal.prototype = {
  walk : function() {
    window.alert("トコトコ");
  }
};
 
var SuperAnimal = function() {}
SuperAnimal.prototype = {
  walk : function() {
    window.alert("ダーッ!");
  }
};
 
var Hamster = function() {};
Hamster.prototype = new Animal(); // Animalを関連付け
var ham1 = new Hamster();
ham1.walk(); // 「トコトコ」 [A]
 
Hamster.prototype = new SuperAnimal (); // SuperAnimalを関連付け
var ham2 = new Hamster();
ham2.walk(); // 「ダーッ!」 [B]
ham1.walk(); // ??? [C]
----------------------------
 
◆オブジェクトと連想配列
//・JavaScriptではオブジェクトと連想配列との間に厳密な区別はない
//・JavaScriptの世界においては同一の概念
 
var obj = new Object();
obj.x=1;
obj.x=2;
var obj = {x:1,y:2};
 
obj.x
obj["x"]
 
//・オブジェクト配下のメンバを列挙できる(prototypeは除く)
//・prototypeプロパティがDontEnum属性でマーキングされている
//・DontEnum属性が付与されたメンバは、for…inループによる
// 列挙の対象から外される
 
var ary = new Array();
for (name in ary) { window.alert(name); }
 
PR

◆JavaScriptのデバッグ方法~補足

IEでスクリプトデバッガ⇒開くで適当なVisualStudioを設定しておく
後は、設定したIEのウィンドウにデバッグしたいJavaScriptが含まれた
HTMLを表示すれば何度でもデバッグができる
※IEの窓(スレッド?)に対してデバッグを設定しているから?

 


【JavaScriptのDebug手順】

1.IE でスクリプトのデバッグを有効化
    ①[ツール] メニューの [インターネット オプション] をクリックします。
    ②[インターネット オプション] ダイアログ ボックスの [詳細設定] タブをクリックします。
    ③[ブラウズ] の下の [スクリプトのデバッグを使用しない] チェック ボックスをオフにします。
    ④[OK] をクリックします。
    ⑤IE を終了して再起動します。

2.ソースの準備
    ①JavaScriptを埋め込んだHTMLを作成
    ②IEで上記HTMLを開く

3.VisualStudioでデバッグ
    ①IE で、[表示] メニューの [スクリプト デバッガ] をポイントし、
     [開く] をクリックします。
    ②[Visual Studio Just-In-Time デバッガ] ダイアログ ボックスが表示されます。
    ③IE 7 では、メニュー バーが表示されないことがあります。
     メニュー バーが表示されない場合は、[ツール] をクリックし、[メニュー バー] をクリックして、
     メニュー バーを表示します。
    ④[利用可能なデバッガ] ボックスの一覧の [新しいインスタンス Visual Studio] をクリックします。
     ※既に立ち上げ済みのVisual Studioが存在すればそれを選択しても可
    ⑤[はい] をクリックします。
 


PAGE TOP