[解決済み] JavaScriptの「new」キーワードとは何ですか?
質問
は
new
というキーワードは、JavaScriptがオブジェクト指向のプログラミング言語ではないと思われがちなので、最初に遭遇したときはかなり混乱するかもしれません。
- 何ですか?
- どのような問題を解決するのですか?
- どのような場合に適切で、どのような場合に適切でないか?
どのように解決するのですか?
5つのことをやっています。
- 新しいオブジェクトを作成します。 このオブジェクトの型は、単純に オブジェクト .
- この新しいオブジェクトの内部で、アクセスできないように設定します。 [プロトタイプ]]です。 (すなわち __proto__ ) プロパティを、コンストラクタ関数の外部でアクセスできるようにします。 プロトタイプ オブジェクトを作成します(すべての関数オブジェクトは、自動的に プロトタイプ プロパティがあります)。
-
を作るのです。
this
変数が新しく作成されたオブジェクトを指すようにします。 -
コンストラクター関数を実行し、新しく作成されたオブジェクトを使用します。
this
が記載されています。 -
コンストラクタの関数が非特権を返さない限り、新しく作成されたオブジェクトを返します。
null
オブジェクトへの参照です。この場合、そのオブジェクト参照が代わりに返される。
注
コンストラクタ関数
の後の関数を指します。
new
キーワードのように
new ConstructorFunction(arg1, arg2)
これが終わると、新しいオブジェクトの未定義のプロパティが要求された場合、スクリプトはそのオブジェクトの [プロトタイプ]] オブジェクトの代わりにそのプロパティを使用します。このようにして、JavaScriptで伝統的なクラス継承に似たものを得ることができるのです。
この中で一番難しいのは、2番のポイントです。 すべてのオブジェクト(関数を含む)には [プロトタイプ]]です。 . それは のみ オブジェクト作成時に 新しい を使用します。 Object.create またはリテラルに基づく(関数のデフォルトはFunction.prototype、数値はNumber.prototypeなど)。読み取ることができるのは Object.getPrototypeOf(someObject) . あるのは いいえ この値を設定したり読み取ったりする他の方法。
関数は、非表示の [プロトタイプ]]です。 というプロパティも持っています。 プロトタイプ そして、このオブジェクトにアクセスし、変更することで、作成したオブジェクトに継承されたプロパティやメソッドを提供することができるのです。
以下はその例です。
ObjMaker = function() {this.a = 'first';};
// ObjMaker is just a function, there's nothing special about it that makes
// it a constructor.
ObjMaker.prototype.b = 'second';
// like all functions, ObjMaker has an accessible prototype property that
// we can alter. I just added a property called 'b' to it. Like
// all objects, ObjMaker also has an inaccessible [[prototype]] property
// that we can't do anything with
obj1 = new ObjMaker();
// 3 things just happened.
// A new, empty object was created called obj1. At first obj1 was the same
// as {}. The [[prototype]] property of obj1 was then set to the current
// object value of the ObjMaker.prototype (if ObjMaker.prototype is later
// assigned a new object value, obj1's [[prototype]] will not change, but you
// can alter the properties of ObjMaker.prototype to add to both the
// prototype and [[prototype]]). The ObjMaker function was executed, with
// obj1 in place of this... so obj1.a was set to 'first'.
obj1.a;
// returns 'first'
obj1.b;
// obj1 doesn't have a property called 'b', so JavaScript checks
// its [[prototype]]. Its [[prototype]] is the same as ObjMaker.prototype
// ObjMaker.prototype has a property called 'b' with value 'second'
// returns 'second'
クラス継承のようなものです。
new ObjMaker()
も 'b' プロパティを継承しているように見えるでしょう。
サブクラスのようなものが欲しい場合は、このようにします。
SubObjMaker = function () {};
SubObjMaker.prototype = new ObjMaker(); // note: this pattern is deprecated!
// Because we used 'new', the [[prototype]] property of SubObjMaker.prototype
// is now set to the object value of ObjMaker.prototype.
// The modern way to do this is with Object.create(), which was added in ECMAScript 5:
// SubObjMaker.prototype = Object.create(ObjMaker.prototype);
SubObjMaker.prototype.c = 'third';
obj2 = new SubObjMaker();
// [[prototype]] property of obj2 is now set to SubObjMaker.prototype
// Remember that the [[prototype]] property of SubObjMaker.prototype
// is ObjMaker.prototype. So now obj2 has a prototype chain!
// obj2 ---> SubObjMaker.prototype ---> ObjMaker.prototype
obj2.c;
// returns 'third', from SubObjMaker.prototype
obj2.b;
// returns 'second', from ObjMaker.prototype
obj2.a;
// returns 'first', from SubObjMaker.prototype, because SubObjMaker.prototype
// was created with the ObjMaker function, which assigned a for us
私はこのテーマで大量のゴミを読み、最終的に以下のものを見つけました。 このページ 図解入りでとてもわかりやすく説明されています。
関連
-
[解決済み] Error : 未定義のプロパティ 'map' を読み取ることができません。
-
[解決済み】Node.jsで "Cannot find module "エラーを解決するには?
-
[解決済み】 Uncaught TypeError : undefined のプロパティ 'replace' を読み取れない In Grid
-
JavaScriptのStringに関する共通メソッド
-
[解決済み] JavaScriptで "use strict "は何をするのか、その根拠は?
-
[解決済み] let "と "var "の使い分けは?
-
[解決済み] JavaScriptでオブジェクトをディープクローンする最も効率的な方法は何ですか?
-
[解決済み] とは何ですか! (not not)演算子とは何ですか?
-
[解決済み] varキーワードの目的と、どのような場合に使用する(または省略する)べきですか?
-
[解決済み] JavaScriptのinstanceof演算子とは何ですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
JavaScriptにおけるマクロタスクとミクロタスクの詳細
-
Vueはランニングライト形式のテキストを水平方向にスクロールする機能を実装している
-
WeChatアプレット用ユニアプリによるグローバルシェアリング
-
vueのプロジェクトでモックを使用する方法を知っていますか?
-
Vueのフォームイベントのデータバインディングの説明
-
[解決済み] テスト
-
[解決済み] 期待される代入または関数呼び出し: 未使用式なし ReactJS
-
[解決済み] TypeError: $.ajax(...) is not a function?
-
[解決済み】 env: node: macにそのようなファイルやディレクトリはありません
-
Uncaught TypeError: null のプロパティ 'offsetHeight' を読み取れませんでした。