---
# System prepended metadata

title: Day16 【牙起來】 成員、方法 - Typescript

---

# Day16 【牙起來】 成員、方法 - Typescript

將我們前幾天的小遊戲程式 `store.component.ts` 拿出來

![](https://i.imgur.com/8gre72h.png)


整個 `.ts` 檔案都是用 `Typescript` 語法
我們將其中的 `class` 物件部分拿出來，貼到Typescript專案的 `main.ts` 上分析

並且要拿掉程式碼 `implements OnInit`
因為這段是給Angular專案看的

> 或者說因為沒有 `@angular/core` 的 `node_modules`包
> 沒得使用，所以才要拿掉
> 
> ![](https://i.imgur.com/agQ0dgV.png)

## Angular中的物件

接下來我們來看一下何謂Angular元件中的**物件**

以下是 `main.ts` 檔案

```typescript=
export class StoreComponent {

    weapons = [
        {name: '小劍', atk: '5'},
        {name: '彎刀', atk: '7'},
        {name: '大魔劍', atk: '11'}
    ];

    constructor() {
    }


    ngOnInit(): void {
    }

}
```

![](https://i.imgur.com/k9CpsOc.png)


接下來執行

    > tsc main.ts
    
來看一下生成出來的 `.js` 檔案

![](https://i.imgur.com/4EgjjH7.png)

```javascript=
"use strict";
exports.__esModule = true;
exports.StoreComponent = void 0;
var StoreComponent = /** @class */ (function () {
    function StoreComponent() {
        this.weapons = [
            { name: '小劍', atk: '5' },
            { name: '彎刀', atk: '7' },
            { name: '大魔劍', atk: '11' }
        ];
    }
    StoreComponent.prototype.ngOnInit = function () {
    };
    return StoreComponent;
}());
exports.StoreComponent = StoreComponent;
```

可以看見用**Javascript**語法編寫而成的一個物件

等於說你寫短短少少的幾行`.ts`文字，等同於以上落落長的`.js`程式碼

## 成員 與 方法

仔細看程式碼的其中一部份

`StoreComponent` 是一個物件變數，底下有
* `StoreComponent()` 方法，其中裡面有 `weapons` 成員
* `ngOnInit` 方法


![](https://i.imgur.com/FCLr2zC.png)


這也就是為什麼在前面章節提到
**不是變數(Variable)** 而是**成員(Member)**
**不是函式(Function)** 而是**方法(Method)**


因為這些東西、功能被包裝成了一個物件，是物件底下的功能

在物件導向的世界裡
原本認知的變數就稱作**成員(Member)**
原本認知的函式就稱作**方法(Method)**

在前幾天的小遊戲中
我們在程式碼使用`this` ，代表了**這個物件本身**
是透過 `this.hp` 來取得這個物件底下的成員 `hp`

![](https://i.imgur.com/upSU1J0.png)


## 複雜一點的程式碼

我們拿掉 `ngOnInit()` 與 `constructor()`

然後新增一些東西，在`.ts`的**方法**裡面寫**函式**

```typescript=
export class StoreComponent {
    atk = 1;

    weapons = [
        {name: '小劍', atk: '5'},
        {name: '彎刀', atk: '7'},
        {name: '大魔劍', atk: '11'}
    ];

    addAtk() {
        this.atk += 1;
    }

    test() {
        let a = '10';

        let printHello = function () {
            console.log('Hello');
        }

        printHello()
    }
}
```

編譯完後的`.js`

```javascript=
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.StoreComponent = void 0;
class StoreComponent {
    constructor() {
        this.atk = 1;
        this.weapons = [
            { name: '小劍', atk: '5' },
            { name: '彎刀', atk: '7' },
            { name: '大魔劍', atk: '11' }
        ];
    }
    addAtk() {
        this.atk += 1;
    }
    test() {
        let a = '10';
        let printHello = function () {
            console.log('Hello');
        };
        printHello();
    }
}
exports.StoreComponent = StoreComponent;
```

* 橘色區塊代表**物件(Object)**
* 綠色區塊是**方法(Method)**
* 黃色區塊是**成員(Member)**
* 藍色區塊是**變數(Variable)、函式(Function)**

![](https://i.imgur.com/Ccjjj0o.png)

我們在 `.ts` 檔中沒有寫 `constructor()`
可是編譯完後出現在 `.js` 檔案中
代表 `constructor` 是物件構件時的必要步驟


> 若能看懂以上的物件結構對應關係，恭喜你已經完成32%的Typescript
