JavaScriptの継承:Object.createとnewの違いをわかりやすく解説
JavaScriptの継承におけるObject.createとnewの違い
JavaScriptでプロトタイプ継承を実装する際、Object.create()を使う方法とnew演算子を使う方法の2つがよく知られています。一見似ているように見えますが、この2つはまったく異なる動作をします。それぞれの違いを詳しく見ていきましょう。
例1:Object.create()を使った継承
最初の例では、amitBaseClassのプロトタイプのみを継承しています。
function SomeClass() {
}
SomeClass.prototype = Object.create(amitBaseClass.prototype);この方法では、amitBaseClass.prototypeをプロトタイプとして持つ新しいオブジェクトを作成し、それをSomeClass.prototypeに代入しています。重要なのは、コンストラクタ関数は一切実行されないという点です。そのため、基底クラスのコンストラクタ内に初期化処理(プロパティの設定など)がある場合、それは実行されません。純粋にメソッドやプロトタイプチェーンだけを受け継ぎたい場合に適した方法です。
例2:new演算子を使った継承
2番目の例では、コンストラクタ関数を実際に実行しています。amitBaseClassのインスタンスが生成され、その完全なオブジェクト全体を継承することになります。
function SomeClass () {
}
SomeClass.prototype = new amitBaseClass ();この方法では、new amitBaseClass()によって新しいインスタンスが作成され、コンストラクタ内の初期化処理も実行されます。その結果、プロトタイプ上のメソッドだけでなく、インスタンス自身のプロパティまで含めたオブジェクト全体がSomeClass.prototypeに引き継がれます。
両者の違いのまとめ
このように、2つのアプローチはそれぞれ別の役割を果たしています。
- Object.create():プロトタイプチェーンだけを継承する。コンストラクタは実行されないため、副作用がない。
- new演算子:コンストラクタを実行してインスタンスを生成し、その完全なオブジェクト(独自プロパティを含む)を継承する。
現代のJavaScriptでは、意図しない初期化処理や副作用を避けるために、プロトタイプの継承にはObject.create()を使うことがベストプラクティスとされています。ES6以降であれば、class構文とextendsキーワードを使うことで、より明確かつ安全に継承を実現できます。
-
JavaScriptで多次元オブジェクトを作成する方法【サンプルコード付き】
はじめに JavaScriptでは、オブジェクトのプロパティの値として別のオブジェクトを持たせることで、多次元(ネストされた)オブジェクトを作成できます。この構造を活用すると、氏名や学校情報、住所のように階層関係のあるデータを、直感的かつ整理された形で表現することが可能です。 サンプルコード 以下は、多次元JavaScriptオブジェクトを作成し、コンソールに表示するためのコード例です。 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8" /
-
【JavaScript入門】Symbolを使ってオブジェクトごとに一意のIDを作成する方法
はじめにJavaScriptでオブジェクトごとに一意のIDを作成したい場合、Symbol()を使うのが最も簡単かつ確実な方法です。Symbolは呼び出されるたびに必ず新しい一意の値を生成するため、たとえ同じ説明文字列を渡しても、二度と同じ値にはなりません。以下は、各オブジェクトに対して一意のIDを作成するサンプルコードです。実装例<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8" /> <meta name="viewp