【JavaScript】データ管理の基本単位!オブジェクトの定義とプロパティ操作

目次

概要

プログラミングにおいて、関連する複数のデータ(名前、ID、状態など)をバラバラの変数で管理するのは非効率です。

JavaScriptの「オブジェクト(Object)」を使えば、これらをひとまとめにしてパッケージ化できます。さらに、データだけでなく「処理(メソッド)」も内包できるため、アプリケーションの構成要素を定義するのに最適です。本記事では、Webアプリの設定データを例に、オブジェクトの構造化と操作方法を解説します。

仕様(入出力)

オブジェクトリテラル { ... }

波括弧 {} の中に キー: 値 のペアをカンマ区切りで記述します。

構成要素記述例説明
プロパティtheme: 'dark'静的なデータ。文字列、数値、真偽値、配列、さらに別のオブジェクトも格納可能。
メソッドsave: () => { ... }オブジェクトに関連付いた関数(処理)。
  • 入力: 定義したいデータ群
  • 出力: 構造化されたオブジェクト
  • アクセス方法: オブジェクト.キー(ドット記法)または オブジェクト['キー'](ブラケット記法)

基本の使い方

1. 基本的な定義とアクセス

関連する情報を1つの変数にまとめます。

// アプリケーションの設定定義
const appConfig = {
    version: 1.5,
    appName: 'MyEditor',
    isProMode: true
};

// データの取得
console.log(appConfig.appName); // "MyEditor"

2. 階層構造(ネスト)とメソッド

オブジェクトの中にオブジェクトを入れたり、関数を持たせたりできます。

const gameCharacter = {
    name: 'Hero',
    stats: { // ネストされたオブジェクト
        hp: 100,
        mp: 50
    },
    items: ['Sword', 'Potion'], // 配列
    attack: () => { // メソッド
        console.log('攻撃しました!');
    }
};

console.log(gameCharacter.stats.hp); // 100
gameCharacter.attack(); // "攻撃しました!"

コード全文(HTML / JavaScript)

Webアプリケーションの「環境設定(Config)」をオブジェクトとして管理し、画面に現在の設定状況を表示するダッシュボードを作成します。

複雑なデータ構造(ネスト)やメソッドの呼び出しを含みます。

HTML

<!DOCTYPE html>
<html lang="ja">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>System Configuration</title>
    <style>
        .config-panel {
            font-family: 'Consolas', 'Monaco', monospace;
            max-width: 450px;
            background-color: #282c34;
            color: #abb2bf;
            padding: 20px;
            border-radius: 8px;
            box-shadow: 0 4px 15px rgba(0,0,0,0.3);
        }
        h3 {
            margin-top: 0;
            color: #61afef;
            border-bottom: 1px solid #3e4451;
            padding-bottom: 10px;
        }
        .config-group {
            margin-bottom: 15px;
        }
        .label {
            color: #e06c75;
            margin-right: 10px;
        }
        .value {
            color: #98c379;
        }
        .nested {
            margin-left: 20px;
            border-left: 2px solid #3e4451;
            padding-left: 10px;
        }
        .btn-action {
            background-color: #61afef;
            color: #282c34;
            border: none;
            padding: 8px 16px;
            border-radius: 4px;
            cursor: pointer;
            font-weight: bold;
            margin-top: 10px;
        }
        .btn-action:hover {
            background-color: #4aa3ee;
        }
        #log-area {
            margin-top: 15px;
            font-size: 0.9em;
            color: #d19a66;
        }
    </style>
</head>
<body>

<div class="config-panel">
    <h3>System Configuration</h3>
    
    <div class="config-group">
        <span class="label">App Name:</span>
        <span id="conf-name" class="value">--</span>
    </div>
    
    <div class="config-group">
        <span class="label">Display Settings:</span>
        <div class="nested">
            <div>Theme: <span id="conf-theme" class="value">--</span></div>
            <div>Resolution: <span id="conf-res" class="value">--</span></div>
        </div>
    </div>

    <div class="config-group">
        <span class="label">Enabled Modules:</span>
        <span id="conf-modules" class="value">--</span>
    </div>

    <button id="btn-save" class="btn-action">設定を保存 (Execute Method)</button>
    <div id="log-area"></div>
</div>

<script src="config_manager.js"></script>
</body>
</html>

JavaScript

/**
 * システム設定管理スクリプト
 * 複雑なオブジェクト構造の定義と操作
 */

// 1. 設定データの定義
const systemConfig = {
    // 基本的なプロパティ
    appName: 'DevDashboard Pro',
    version: 2.0,
    
    // ネストされたオブジェクト(表示設定)
    display: {
        theme: 'Dark Mode',
        resolution: '1920x1080',
        zoomLevel: 100
    },

    // 配列を含むプロパティ
    modules: ['Analytics', 'Debugger', 'CloudSync'],

    // メソッドの定義(設定保存処理のシミュレーション)
    saveSettings: function() {
        // このメソッド内での処理
        const timestamp = new Date().toLocaleTimeString();
        return `Settings saved successfully at ${timestamp}.`;
    }
};

// DOM要素
const elName = document.getElementById('conf-name');
const elTheme = document.getElementById('conf-theme');
const elRes = document.getElementById('conf-res');
const elModules = document.getElementById('conf-modules');
const btnSave = document.getElementById('btn-save');
const logArea = document.getElementById('log-area');

/**
 * 設定情報を画面に反映する関数
 */
const renderConfig = () => {
    // 1階層目のアクセス
    elName.textContent = systemConfig.appName;

    // 2階層目(ネスト)へのアクセス
    elTheme.textContent = systemConfig.display.theme;
    elRes.textContent = systemConfig.display.resolution;

    // 配列の結合
    elModules.textContent = systemConfig.modules.join(', ');
};

/**
 * 保存ボタンクリック時の処理
 */
const onSaveClick = () => {
    // オブジェクト内のメソッドを実行
    const message = systemConfig.saveSettings();
    
    // 結果を表示
    logArea.textContent = message;
    console.log('Saved:', systemConfig);
};

// 初期表示
renderConfig();

// イベントリスナー
btnSave.addEventListener('click', onSaveClick);

カスタムポイント

  • プロパティの追加・変更:systemConfig.newProp = 'Value'; のように後から自由にプロパティを追加したり、値を上書きしたりできます。
  • 短縮記法:変数名とプロパティ名が同じ場合、ES6では { name, age } のように省略して記述できます({ name: name, age: age } と同じ)。

注意点

  1. const でも中身は変更可能オブジェクトを const で宣言しても、それは「変数の再代入」を防ぐだけで、obj.key = 'newValue' のように中身のプロパティを変更することは可能です。完全に変更不可にするには Object.freeze() を使用します。
  2. 存在しないプロパティへのアクセスsystemConfig.unknownKey のように存在しないキーにアクセスしてもエラーにはならず、undefined が返されます。ネストされた systemConfig.unknown.key にアクセスするとエラーになるため、オプショナルチェーン ?. の使用を検討してください。

応用

オブジェクトの凍結(イミュータブル化)

設定値など、アプリ実行中に書き換わってほしくない重要なオブジェクトは Object.freeze() で保護します。

const serverSettings = Object.freeze({
    host: 'api.example.com',
    port: 443
});

// 無視される(strictモードではエラー)
serverSettings.port = 8080; 

console.log(serverSettings.port); // 443 のまま

まとめ

オブジェクト {} は、JavaScriptにおけるデータ構造の主役です。

  • まとめる: 関連するデータや関数をパッケージ化する。
  • 階層化: オブジェクトの中にオブジェクトを入れて整理する。
  • 操作: ドット記法 . で直感的にアクセスする。

単なる変数の羅列から脱却し、意味のある単位でデータを管理することで、コードの可読性と保守性が飛躍的に向上します。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

私が勉強したこと、実践したこと、してることを書いているブログです。
主に資産運用について書いていたのですが、
最近はプログラミングに興味があるので、今はそればっかりです。

目次