意味new 演算子は、ユーザー定義のオブジェクト タイプのインスタンス、またはコンストラクターを持つ組み込みオブジェクトのインスタンスを作成します。 オブジェクト インスタンスを作成するには、新しい [コンストラクター] メソッドを使用しますが、コンストラクターが異なると、異なるインスタンスが作成されます。 コンストラクタ本体は異なるコンストラクタも関数です。唯一の違いは呼び出し方法です。new 演算子で呼び出される関数はすべてコンストラクタであり、new 演算子で呼び出されない関数は通常の関数です。 したがって、コンストラクターにも戻り値がありますが、これにより new の結果が異なります。 戻り値なし関数 Person(名前) { this.name = 名前; } obj = new Person("Jalenl"); とします。 コンソールにログ出力します。 明らかに、印刷されているのは{name:'Jalenl'}です 戻りオブジェクト関数 Person(年齢) { this.age = 年齢; 戻り値: { name: "Jalenl" }; } obj = new Person(18); とする。 コンソールにログ出力します。 印刷されるのは {name:'Jalenl'} であり、これは return の前のすべての定義が上書きされることを意味します。ここで返されるのはオブジェクトですが、基本型の場合はどうなるでしょうか? 非オブジェクトを返す関数 Person(年齢) { this.age = 年齢; 1 を返します。 } obj = new Person(18); とする。 コンソールにログ出力します。 {age:21} を返します。これは戻り値が無効であることを意味し、戻り値がない場合と同じ結果になります。このバインドされた内部属性がなく、基本データ型が返された場合はどうなるでしょうか。 プロパティバインディングなし + 非オブジェクトを返す関数Person(){ 戻り値 1 } 新しい人() 返される値は、予想どおり、空のオブジェクト {} です。 要約すると、初期結果は、コンストラクターの戻り値がオブジェクト型を返す場合にのみ変更できます。 コンストラクタの型は異なりますコンストラクタは通常の関数であるECMA-262 第 3 版仕様では、オブジェクト インスタンスを作成するプロセスについて説明しています。
総括する:
5 番目のステップでは、異なるコンストラクターが異なる新しい結果につながる理由をすでに説明しました。 以下はMDNからの説明です。
コンストラクタは矢印関数である通常の関数が作成されると、エンジンは特定のルールに従って、この関数のプロトタイプ プロパティ (プロトタイプ オブジェクトを指す) を作成します。デフォルトでは、すべてのプロトタイプ オブジェクトは、関連付けられているコンストラクターを指すコンストラクターと呼ばれるプロパティを自動的に取得します。 関数Person(){ 18歳未満 } 人物プロトタイプ /** { コンストラクタ: ƒFoo() __proto__: オブジェクト } **/ 矢印関数を作成する場合、エンジンはそれのプロトタイプ プロパティを作成しません。矢印関数には new を呼び出すコンストラクターがないため、new を使用して矢印関数を呼び出すとエラーが発生します。 定数 Person = ()=>{} new Person() // TypeError: Foo はコンストラクタではありません 手書きの新着まとめると、new の動作原理を理解した後は、自分でロープロファイルバージョンの new を実装できます。実装の鍵は次のとおりです。
関数_new(コンストラクタ、...引数) { // コンストラクタ型の法的判断 if(typeof コンストラクタ !== 'function') { throw new Error('コンストラクタは関数である必要があります'); } // 新しい空のオブジェクトインスタンスを作成します。let obj = new Object(); // コンストラクターのプロトタイプを新しく作成されたオブジェクトインスタンスにバインドします。obj.__proto__ = Object.create(constructor.prototype); // コンストラクターを呼び出して戻り値を決定します。let res =constructor.apply(obj, args); isObject = typeof res === 'object' && res !== null とします。 isFunction = typeof res === 'function' とします。 // 戻り値があり、それがオブジェクト型である場合は、それを戻り値として使用し、それ以外の場合は以前に作成されたオブジェクトを返します。 return isObject || isFunction ? res : obj; }; この目立たない new 実装は、カスタム クラスのインスタンスを作成するために使用できますが、組み込みオブジェクトはサポートされません。結局のところ、new は演算子であり、基礎となる実装はより複雑です。 要約するJS における new の原理と実装に関するこの記事はこれで終わりです。JS における new の原理と実装に関するより関連性の高いコンテンツについては、123WORDPRESS.COM で以前の記事を検索するか、以下の関連記事を引き続き参照してください。今後とも 123WORDPRESS.COM を応援していただければ幸いです。 以下もご興味があるかもしれません:
|
<<: ウェブデザインにおけるポップアップウィンドウとフローティングレイヤーのデザイン
最近、顔コレクションに関するプロジェクトに取り組んでいましたが、フロントエンドモジュールを書いている...
目次序文1. 404 ページ1. 原因2. 解決策2.白い画面を更新する1. 原因2. 解決策3. ...
この記事の例では、データのページング効果を実現するためのjsオブジェクトの具体的なコードを参考までに...
この状況は通常、中国語言語パックがインストールされていないか、デフォルトの言語設定に問題があるために...
KILL [接続 | クエリ] processlist_id MySQL では、各接続は個別のスレ...
トランザクション分離レベルを確認するMySQL では、'%tx_isolation%'...
HTML 中心のフロントエンド開発は、ほぼ Web 標準の意味です。共通しているのは「分離」という考...
序文古いプロジェクトを引き継ぐ苦労 - MongoDB クラスターの学習と構築に関する前回の記事を読...
CSSファイルに書き込むコードをコピーコードは次のとおりです。 01.html {グレイスケール(1...
最近のプロジェクトでフォームを作成するときに、コメント ボックスまで自動的にスクロールし、コメント ...
この記事では、マルチカラムレイアウトドラッグを実装するためのVueの具体的なコードを参考までに共有し...
非常に大量のデータ(数百 GB)を計算する必要があったことはありますか?または、その内部を検索したり...
目次序文: 1.DEFINERの簡単な紹介2. いくつかの注意点要約:序文: MySQL データベー...
目次1 コンテナクラウドとは何ですか? 2 Dockerの紹介3 dockerを使ってMySQLをイ...
公式サイトをダウンロードまず公式ウェブサイトにアクセスしてMySQLをダウンロードしてくださいリンク...