2020/06/07

[js]オブジェクト

JavaScriptがわからないと困ることが多くなってきた。
golangの勉強もまだまだなのだが、平行してやらないと。

ネットで検索しながら勉強しているとよくわからなくなってきたので、本を買った。

O'Reilly Japan - 開眼! JavaScript
https://www.oreilly.co.jp/books/9784873116211/

さあ、私も開眼できるのだろうか?


こんなことが書いてあった。

オブジェクトはプロパティの集合体を格納するコンテナです。

メソッドも含めてプロパティなのだそうだ。

 

そりゃそうだろう、と思っていたのだが、JavaScriptのオブジェクトはC++やJavaよりも柔軟というか、golangに近いようだ。

時系列的にはgolangの方が後から出た言語なので、逆だろう、といわれそうだが、私が勉強した順だから仕方ない。

 

var Person = function(living, age, gender) {
    'use strict';
    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);

var bob = new Object();
bob.living = false;
bob.gender = 'zombie';
bob.age = 153;
console.log(bob);

function print(aaa) {
    'use strict';
    console.log(aaa.age);
}

print(cody);
print(bob);

 

codyはPersonはコンストラクタで作ったインスタンスで、bobはObjectをnewして作ったインスタンスだ。
しかし、関数(オブジェクトに紐付いてなくてもメソッドなのかな?)のprint()で引数としてはどちらでも受け入れるし、出力も期待通りになった。

Javaはすべてのclassはjava.lang.Objectの派生だったと思うが、JavaScriptはそういう継承とか何とかいう概念ではなく、プロパティの名前が一致していれば「そういうプロパティがある」ということを受け入れてくれるのだ。

 

これは、bobのプロパティを設定する順番を変更し、ageを文字列にして、getLiving()というメソッドを追加したのだが、それでも実行時エラーにならない。
print()なんか、演算までしているのに、だ。

var Person = function(living, age, gender) {
    'use strict';
    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);

var bob = new Object();
bob.gender = 'zombie';
bob.age = '153';
bob.getLiving = function() {
    return this.living;
};
bob.living = false;
console.log(bob);

function print(aaa) {
    'use strict';
    console.log(aaa.age + 3);
}

print(cody);
print(bob);

$ node prop.js
Person { living: true, age: 33, gender: 'male', getGender: [Function] }
{ gender: 'zombie', age: '153', getLiving: [Function], living: false }
36
1533

codyのageは数字だったので3を足し、bobのageは文字列だったので’3’が末尾に追加された。

 

一番最後にこういうのを追加しても、それでも動く。

cody.age = '99';
print(cody);

993

 

この辺が、C++やJavaのような言語と違うところだろう。
最初に決めた型が絶対ではないのだ。C++で同じことをしようとしたら、void*と型を示す変数を追加するとかになるのか?

 

ともかく、オブジェクトは単なる入れ物だ、ということだ。
そしてこの自由さが私にとってはすごくやりづらいところでもある。慣れるしかないのだが。。。

0 件のコメント:

コメントを投稿

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