ES2015 より前のクラスについてのメモ
github.com
基本
ES2015 より前の構文。
ブラウザで実行する場合は、Babel を使わなくても、IE11 で実行することができる形。
もちろん Node.js でも実行することができる。
function Member(firstName, lastName) {
this.firstName = firstName;
this.lastName = lastName;
this.age = 23;
this.getName = function() {
return firstName + lastName;
};
}
js のクラスはクラスというより、ただの関数
new をつけて呼ぶことで、ただん関数をコンストラクタとして実行することができる
コンストラクタとして呼ぶと、空のオブジェクト(this)を作って、暗黙的に作成したオブジェクを返す。
※コンストラクタで return を定義することで、返却するオブジェクトをさわることもできるが、あんまりやらない。
また prototype の継承とかも行う。
https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Operators/new
より噛み砕いた記事。
https://qiita.com/takeharu/items/809114f943208aaf55b3
上記挙動から、this を固定するアロー関数をコンストラクタとして定義することはできない
var Member = () => {};
var member = new Member();
なるほどと思った。
var member = new Member("tarou", "yamada");
console.log(member.getName());
var directCall = Member("fail", "fail");
console.log(directCall);
console.log(firstName);
ちょっと横道、this のコンテキストの話
this のコンテキストは、以下をおぼえとく!
- トップ:グローバル
- 関数:グローバル → なんとなく関数そのものをさすと思ってた。コンストラクタと違うから注意。
- コンストラクタ:生成したインスタンス、
- メソッド:レシーバ
- イベントリスナー: イベントの発生元
- bind・apply: 引数で指定したオブジェクト
var obj = {
a: 1,
b: function() {
console.log(this);
}
};
console.log(obj.b());
prototype の話
javascritp のクラスはただの関数
関数のプロパティの値が関数であればそれが、メソッドになる
new 演算子をつけると、新しいオブジェクトを返してくれる
新しいオブジェクトをつくると、オブジェクトのプロパティにセットされる関数も毎回生成されることになる
メモリがもったいない。javascript は prototype というものを用意してくれている。
Member.prototype.getAge = function() {
return this.age;
};
console.log("age:", member.getAge());
Member.address = "shizuoka";
console.log("from Class", Member.address);
console.log("from instance", member.address);
Member.getAddress = function() {
return this.address;
};
console.log(Member.getAddress());
prototype を定義する際には、オブジェクトリテラルで一括で設定する方がわかりやすい
var Bot = function() {};
Bot.prototype = {
sayHello: function() {
console.log("Hello");
}
};
var bot = new Bot();
bot.sayHello();
継承の話
var Animal = function(name) {
this.name = name;
};
Animal.prototype = {
walk: function() {
console.log(this.name, "is waking....");
}
};
var Cat = function(name) {
Animal.call(this, name);
};
Cat.prototype = new Animal();
Cat.prototype.bark = function() {
console.log(this.name, "> nyaan");
};
var mycat = new Cat("mike");
mycat.walk();
mycat.bark();