2020/06/13

[js]classがあるのか

JavaScriptのオブジェクトはプロパティが入っているだけだから恐るるに足らず!と思っていたのだが、classなんてものがあることに気付いた。

https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Statements/class

ECMAScript2015で導入されたらしいので、サポートしていないエンジンだと使えないのだろう。
Node.jsはだいたい対応しているようだから、気にしなくてよいか。
まあ、私がclassを使うかどうかもわからんがね。


class Person {
    living;
    age;
    gender;

    constructor(living, age, gender) {
        this.living = living;
        this.age = age;
        this.gender = gender;
        this.getGender = function() { return this.gender; };
    }
}

var cody = new Person(true, 33, 'male');
console.log(cody);

$ node prop.js
Person { living: true, age: 33, gender: 'male', getGender: [Function] }

 

うーん、これでは違いがよくわからん。。。
GUIの部品とオブジェクト指向は相性がいいような話を聞くので、使いやすいシーンがあるのだろう。


前回のように、コンストラクタを置き換えてみる。

class Person {
    living;
    age;
    gender;

    constructor(living, age, gender) {
        this.living = living;
        this.age = age;
        this.gender = gender;
        this.getGender = function() { return this.gender; };
    }
}

var cody = new Person(true, 33, 'male');
console.log(cody);

cody.constructor = function Yoshio(){};
console.log(cody);

Person.constructor = function(banana) {
    this.banana = banana;
};
var cody2 = new Person('great banana');
console.log(cody2);

$ node prop.js
Person { living: true, age: 33, gender: 'male', getGender: [Function] }
Yoshio {
  living: true,
  age: 33,
  gender: 'male',
  getGender: [Function],
  constructor: [Function: Yoshio]
}
Person {
  living: 'great banana',
  age: undefined,
  gender: undefined,
  getGender: [Function]
}

 

ほう! これは予想外の結果だ。
constructorの置き換えで”Yoshio”になるのは分かるのだが、わからんのはbananaだ。
予想では、bananaというプロパティを追加するのだろうと思っていたのだが、結果としてはlivingが代用されている。というか、bananaのコンストラクタ置き換えができていないように思う。

「オブジェクト」と「インスタンス」で用語を分けるなら、インスタンスのコンストラクタは置き換えられるが、オブジェクトのコンストラクタは変更できないということだろう。

インスタンスになってしまえば、コンストラクタの置き換えもできるし、プロパティ(フィールド?)の追加もできる。
JavaScriptというだけで何でも変更できてしまうという心配をしていたのだが、型になる部分の変更は簡単にはできないということだろう。

0 件のコメント:

コメントを投稿

コメントありがとうございます。
スパムかもしれない、と私が思ったら、
申し訳ないですが勝手に削除することもあります。