オブジェクトとは「値と処理をひとまとめに保管し、名前で取り出せるようにしたもの」
プロパティ: オブジェクトの中の値
メソッド: オブジェクトの中の関数
同じプロパティやメソッドを使う場合、this. と書く
const person = {
    name: "taro",
    age: 39,
    print: function(): void {
        console.log(this.name + '('
            + this.age + ')')
    }
}
person.print()
person.name = 'hanako'
person.age = 28
person.print()
### Objectによる生成
const person = Object()
person.name = "taro"
person.age = 39
person.print = function():void {
    console.log(this.name + '('
        + this.age + ')')
}
### ファクトリ関数
ファクトリとは値を作成するもの
function Person(n:string, a:number):
        {name:string, age:number, print:()=>void}{
    return {
        name: n,
        age: a,
        print: function(){
            console.log(this.name +
                '(' + this.age + ')')
        }
    }
}
const taro = Person('taro', 39)
const hana = Person('hanako', 28)
taro.print()
hana.print()
### オブジェクトに引数を通過う
type person = {name:string, age:number}
function setData(ob:person, n:string, a:number):person {
    ob.name = n
    ob.age = a
    return ob
}
const ob1:person = {name:'taro', age:39}
const ob2:person = setData(ob1, 'hanako', 28)
console.log(ob1)
console.log(ob2)
### オブジェクトの分割代入
type person = {name:{first:string, second:string}, age:number}
const ob1:person = {name:{first:'taro', second: 'yamada'}, age:39}
const {name:{first, second}, age} = ob1
console.log(first + "-" + second + '::' + age)
### プロパティのオプションとReadonly
type person = {readonly name:string, mail?:string, age?:number, print:()=>void}
const ob1:person = {
    name: 'taro',
    age: 39,
    print:function():void {
        console.log(this.name + ':' + this.age)
    }
}
const ob2:person = {
    name: 'hanako',
    mail: 'hanako@gmail.com',
    print:function():void {
        console.log(this.name + ':' + this.mail)
    }
}
ob1.print()
ob2.print()
	 
					 
