忍者ブログ
[105] [104] [103] [102] [101] [100] [99] [98] [97] [96] [95]

DATE : 2017/06/29 (Thu)
×

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


DATE : 2006/07/08 (Sat)

コンストラクタからオブジェクトを生成するには、次のようにします。

ここでは、人を表す Person オブジェクトを定義し、生成しています。

function Person(name) {
    this.name = name;
}

var aPerson = new Person("Taro");

「this」は、そのオブジェクトそのものを指します。つまり、上の例では、生成したPerson オブジェクトの name プロパティに引数の name を格納しています。

aPerson.name === "Taro"

コンストラクタ内でプロパティに関数を格納すれば、オブジェクトにメソッドを定義することもできます。しかし、この方法では、インスタンスが生成されるたびに関数も生成されることになります。メソッドはインスタンスごとに共通なことが多いため、毎回生成するとメモリの無駄になります。そこで、メソッドをオブジェクトに定義するには、そのオブジェクトの prototype プロパティにメソッドを定義します。

例えば、人の名前を返す getName メソッドを定義するコードは、以下のようになります。

function Person(name) {
    this.name = name;
}

Person.prototype.getName = function() {
    return this.name;
};

メソッドを使用する方法は、次の通りです。

ここでは、ブラウザに名前を出力してみます。

document.write(aPerson.getName());

複数のメソッドを定義するには、以下のように書くと簡単かもしれません。

ここでは、名前を取得するメソッドと設定するメソッドを設定してみます。

Person.prototype = {
    getName = function() {
        return this.name;
    },

    setName = function(name) {
        this.name = name;
    }
};

なお、オブジェクトに直接定義されたメソッドがある場合は、prototype プロパティに定義されたメソッドよりも優先されます。

ちなみに、プロパティのアクセス制限はできません。つまり、 Java で言う private, protected, package なプロパティは存在しません。全て public なプロパティとなります。

あえて private のようなプロパティを作りたければ、次のように、隠蔽したいプロパティの先頭に「_」を付けるなど、変名を用いるのも一つの手かもしれません。

function Person(name) {
    this._name = name;
}

Person.prototype = {
    getName = function() {
        return this._name;
    },

    setName = function(name) {
        this._name = name;
    }
};
PR
●この記事にコメントする
お名前
タイトル
文字色
メールアドレス
URL
コメント
パスワード
●この記事へのトラックバック
この記事にトラックバックする:
忍者ブログ [PR]
ブログ内検索
最近の状況
リンク
カレンダー
05 2017/06 07
S M T W T F S
1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30
使用許諾
最新コメント
(08/15)
(05/04)
(03/06)
(03/04)
(09/25)
最新トラックバック
T/O
(11/05)
ブログ内検索
最近の状況
リンク
カレンダー
05 2017/06 07
S M T W T F S
1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30
使用許諾
最新コメント
(08/15)
(05/04)
(03/06)
(03/04)
(09/25)
最新トラックバック
T/O
(11/05)