- 追加された行はこの色です。
- 削除された行はこの色です。
* クラス(オブジェクト)の作り方 [#ee1faea0]
*** オブジェクト生成 [#mc80828f]
** オブジェクト生成 [#mc80828f]
var obj = new Object();
obj.name = 'taro';
obj.say = function () { alert("hello, " + this.name); };
を省略して、
var obj = { name : "taro",
say : function() { alert("HELLO!") }
say : function() { alert("hello, " + this.name); }
};
*** 空のクラス定義 [#u48ec2eb]
** クラス定義 [#u48ec2eb]
*** 空のクラス定義 [#ga5b2288]
var Person = function() {};
*** コンストラクタ付きのクラス定義 [#lda4cc3f]
*** コンストラクタ付きのクラス定義 [#fc448499]
var Person = function(name) {
this.name = name;
this.say = function() { alert(this.name); }
this.say = function() { alert("hello, " + this.name); };
};
*** インスタンス生成 [#m5dce2e9]
** インスタンス生成 [#m5dce2e9]
var person = new Person("taro");
person.say();
*** プロトタイプによるメソッド追加 [#n7668f55]
** プロトタイプによるメソッド追加 [#n7668f55]
Person.prototype = {
say2: function() {
alert("2: " + this.name);
alert("hello2, " + this.name);
}
};
person.say2();
*** 継承 [#w1db1e89]
var Person = function(name) { this.name = name; }; // 親クラス
Person.prototype = { say: function() { alert(this.name) }; };
var Man = function(name) { this.name = "Mr." + name; }; // 子クラス
Man.prototype = Person.prototype; // 継承
この方法でArrayのような組込みクラスを拡張する事が可能だが、安易に拡張するとfor inでオブジェクトのプロパティを列挙すると拡張したプロパティ(メソッド)と元のプロパティ(メソッド)が混ざってしまう(prototype汚染)ので注意が必要。
** 継承 [#w1db1e89]
var Person = function(name) { this.name = name; }; // 親クラス作成
Person.prototype = { say: function() { alert("hello, " + this.name) } };
var Man = function(name) { this.name = "Mr." + name; }; // 子クラス作成
Man.prototype = new Person; // 親クラスを継承
var m = new Man("taro");
m.say();
*** Prototype.jsを使って継承 [#q91482f9]
*** prototype継承の注意点 [#fbdffe52]
なお、継承のために、
Man.prototype = new Person;
ではなく、
Man.prototype = Peroson.prototype;
としてはならない。この場合、ManのprototypeはPersonのprototypeを参照する事になるので、
Man.prototype.say2 = function () { alert('hello2') };
のようにManにメソッドを追加すると、Personにもメソッドが追加されてしまう。
var p = new Person();
p.say2(); // 本来、未定義であるべき
** Prototype.jsを使って継承 [#q91482f9]
var Woman = Class.create(); // クラス定義
Object.extend(Woman.prototype, Person.prototype); // 継承
Object.extend(Woman.prototype,{ // メソッドのオーバーライド
initialize: function(name) {
this.name = "Miss." + name;
}
});
var w = new Woman("hanako");
w.say();