
JavaScriptのイベント処理:クリック、フォーム入力からバブリング・デリゲーションまで
はじめに JavaScriptのイベント処理は、インタラクティブなウェブアプリケーション開発の核心です。ユーザーのクリック、フォーム入力、キーボード操作など、あ […]
JavaScriptのオブジェクトは、プロパティ(キーと値のペア)の集合です。オブジェクトは現実世界の「もの」をモデル化するのに最適で、JavaScriptプログラミングの中心的な要素です。
const person = {
name: '山田太郎',
age: 30,
greet: function() {
console.log(`こんにちは、${this.name}です!`);
}
};
const car = new Object();
car.make = 'Toyota';
car.model = 'Corolla';
car.year = 2020;
function Person(name, age) {
this.name = name;
this.age = age;
this.greet = function() {
console.log(`こんにちは、${this.name}です!`);
};
}
const person = new Person('山田太郎', 30);
const personPrototype = {
greet() {
console.log(`こんにちは、${this.name}です!`);
}
};
const person = Object.create(personPrototype);
person.name = '山田太郎';
person.age = 30;
class Person {
constructor(name, age) {
this.name = name;
this.age = age;
}
greet() {
console.log(`こんにちは、${this.name}です!`);
}
}
const person = new Person('山田太郎', 30);
console.log(person.name); // '山田太郎'
person.greet(); // メソッド呼び出し
console.log(person['name']); // '山田太郎'
const prop = 'age';
console.log(person[prop]); // 30
const dynamicKey = 'email';
const user = {
name: '太郎',
[dynamicKey]: 'taro@example.com'
};
person.job = 'エンジニア';
person['hobby'] = '読書';
person.age = 31;
person['age'] = 31;
delete person.hobby;
console.log('name' in person); // true
console.log(person.hasOwnProperty('name')); // true
const calculator = {
add: function(a, b) {
return a + b;
},
// ES6メソッド短縮記法
subtract(a, b) {
return a - b;
}
};
const person = {
name: '太郎',
greet() {
console.log(`こんにちは、${this.name}です!`);
}
};
for (const key in person) {
console.log(`${key}: ${person[key]}`);
}
const keys = Object.keys(person); // キーの配列
const values = Object.values(person); // 値の配列
const entries = Object.entries(person); // [key, value]の配列
const obj1 = { a: 1, b: 2 };
const obj2 = { ...obj1, c: 3 }; // { a: 1, b: 2, c: 3 }
const copy = { ...original };
// または
const copy = Object.assign({}, original);
const deepCopy = JSON.parse(JSON.stringify(original));
const obj = { prop: 42 };
Object.freeze(obj); // 変更不可
Object.seal(obj); // プロパティの追加/削除不可(値の変更は可)
const obj = {};
Object.defineProperty(obj, 'property', {
value: 42,
writable: false, // 書き込み不可
enumerable: true, // 列挙可能
configurable: false // 削除/変更不可
});
name
プロパティにアクセスするコードを2通りの方法で書きなさい。 const person = {
name: '山田太郎',
age: 30
};
email
を追加しなさい。 const user = {
username: 'js_user',
password: 'secure123'
};
const obj = { a: 1, b: 2 };
const copy = obj;
copy.a = 3;
console.log(obj.a);
const car = {
make: 'Toyota',
model: 'Corolla',
year: 2020
};
const obj1 = { a: 1, b: 2 };
const obj2 = { b: 3, c: 4 };
password
プロパティを削除しなさい。 const user = {
username: 'admin',
password: 'secret',
role: 'admin'
};
const original = {
name: 'Test',
nested: {
value: 10
}
};
createUser
関数を実装しなさい。 const user = createUser('太郎', 25);
console.log(user.name); // '太郎'
console.log(user.age); // 25
user.greet(); // 'こんにちは、太郎です!'
const obj = {
value: 10,
getValue() {
return this.value;
},
getValueArrow: () => this.value
};
console.log(obj.getValue());
console.log(obj.getValueArrow());
createImmutableObject
関数を実装しなさい。const person = createImmutableObject({ name: '太郎', age: 30 });
person.name = '花子'; // エラーまたは変更されない
delete person.age; // エラーまたは削除されない
person.job = 'エンジニア'; // エラーまたは追加されない
observeObject
関数を実装しなさい。const user = { name: '太郎' };
const observed = observeObject(user, (prop, oldVal, newVal) => {
console.log(`プロパティ ${prop} が ${oldVal} から ${newVal} に変更されました`);
});
observed.name = '花子'; // コンソールに変更を出力
observed.age = 25; // コンソールに変更を出力
createPrivateProperties
関数を実装しなさい。const obj = createPrivateProperties({ publicProp: '公開プロパティ', _privateProp: '秘密プロパティ' });
console.log(obj.publicProp); // '公開プロパティ'
console.log(obj._privateProp); // undefined
const person = {
name: '山田太郎',
age: 30
};
console.log(person.name); // ドット記法
console.log(person['name']); // ブラケット記法
const user = {
username: 'js_user',
password: 'secure123'
};
user.email = 'user@example.com';
// または
user['email'] = 'user@example.com';
3
const obj = { a: 1, b: 2 };
const copy = obj;
copy.a = 3;
console.log(obj.a); // シャロウコピーの影響を受けるため、3が出力される
const car = {
make: 'Toyota',
model: 'Corolla',
year: 2020
};
const properties = Object.keys(car);
const obj1 = { a: 1, b: 2 };
const obj2 = { b: 3, c: 4 };
const merged = { ...obj1, ...obj2 }; // { a: 1, b: 3, c: 4 }
const user = {
username: 'admin',
password: 'secret',
role: 'admin'
};
delete user.password;
const original = {
name: 'Test',
nested: {
value: 10
}
};
const deepCopy = JSON.parse(JSON.stringify(original));
createUser
関数 function createUser(name, age) {
return {
name,
age,
greet() {
console.log(`こんにちは、${this.name}です!`);
}
};
}
10
undefined
// アロー関数はthisをレキシカルスコープで解決するため
const obj = {
value: 10,
getValue() {
return this.value;
},
getValueArrow: () => this.value
};
console.log(obj.getValue()); // obj.valueの値を取得
console.log(obj.getValueArrow()); // アロー関数はthisを持たないため、undefinedを返す
createImmutableObject
関数function createImmutableObject(obj) {
return Object.freeze(Object.seal(obj));
}
observeObject
関数function observeObject(obj, callback) {
return new Proxy(obj, { set(target, prop, value) { const oldVal = target[prop]; target[prop] = value; callback(prop, oldVal, value); return true; } });
}
createPrivateProperties
関数javascript function createPrivateProperties(obj) {
return new Proxy(obj, { get(target, prop) { if (prop.startsWith('_')) { return undefined; }
return target[prop]; }, has(target, prop) { return !prop.startsWith('_') && prop in target; } });
}