新しいことについて、バグから始めましょう
前書き
今日、フロントエンドグループで、誰かが質問を投稿しているのを見ました:
var o = new Object();function foo(obj){ var obj = o; obj.name = '123'; obj = new Object(); obj.name = '456'; } foo(o); console.log(o.name)
上記のコードに示されているように、条件やデータを変更せずに「456」を出力することは可能ですか?
グループの人々が結論に飛びつき始めるまでに時間はかかりませんでしたが、通常の状況ではそんなことはできません。
その理由は? 参照型の使用方法を少しでも知っている人なら、 new Object() が obj のポインターを変更し、決して取得できないことを知っています 456。
問題は
通常の状況では456を出力することは不可能です。では、どのようなエラー条件下では456が出力されるでしょうか。結局のところ、プログラマはバグを書くのが得意であり、異常な状況を引き起こすことができるはずです。
そのとき、障害のある私は、2日前に学んだばかりのProxyのことを突然思い出しました。値を割り当てるときに問題が発生しました。メタデータから問題を解決できるでしょうか?試してみてください:
//demo_01var o = new Object(); o = new Proxy(o,{ set(target, key, value,receiver){ if(Object.is('name',key)) return Reflect.set(target, key, `456`,receiver); return Reflect.set(target, key, value , receiver); } })function foo(obj){ var obj = o; obj.name = '123'; obj = new Object(); obj.name = '456'; } foo(o); console.log(o.name)
完璧に、正常に 456 を出力しました。
何?プロキシとは何かご存知ですか?ここをクリック –> ES6 インターセプター、プロキシ
それでは、結果をグループに送信して披露してみましょう。まずはチャット履歴を見てみましょう。ふふ、私よりも早く答えている人がいます。さて、最初に他の人の答えを見てみましょう:
//demo_02var o = new Object();Object.defineProperty(o,'name',{ set(val){ this.value = '456'; }, get(){ return this.value; } })function foo(obj){ var obj = o; obj.name = '123'; obj = new Object(); obj.name = '456'; } foo(o); console.log(o.name)
素晴らしい若者、一緒に行こうと思いました。彼らは全員ゲッターとセッターに取り組んでおり、メタレベルでデータを処理しています。
このクラスメートは、ここからインスピレーションを得たという記事を同時に投稿しました。これは本当に完璧なフックです
次に、私の答えも投稿します。つまり、その時の楽しみに参加するだけです。待て、一部の人は不満を表明し、彼は日和見的だと言っていた。 demo_02 コードは、demo_03 コードと完全に同等です:
//demo_03var o = new Object();function foo(obj){ var obj = o; obj.name = '123'; obj = new Object(); obj.name = '456'; } foo(o); o.name = '456'; console.log(o.name);
demo_02 メソッドのコード「obj.name = '456';」が変更されると、デモ_02 コードもそれに応じて変更する必要があります。
それは当然のことです。私が作成したデモ_01 にも同じ問題があります。そうでなければ、恥ずかしい思いをするでしょう。
それでは、この問題を解決して実際の出力を実現する方法はあるのでしょうか456
新しい演算子は何をするのでしょうか?
ところで、私たちの今の問題は何ですか?問題は、obj の this ポインタを変更する new Object() 上にあることです。これを回避する方法はありますか?
何?なぜこのポインタが変わったのかというと、この記事をよく見てください。兵士から始めて、New が何をしたかを覚えています。 Proxy ハンドラーに構築メソッドがあることを確認します。これを Object コンストラクターで変更できます。アイデアは良かったのですが失敗し、実現しませんでした。このアイデアを続けられる人がいたら、答えを教えてください>_< チャット履歴を見ると、クラスメートは別の解決策を示しました:
var o = new Object();var _Object = Object;Object = function(){ return o; }function foo(obj){ var obj = o; obj.name = '123'; obj = new Object(); obj.name = '456'; } foo(o); console.log(o.name)Object = _Object;
今回は、クラスメートがオブジェクトを最初に書き換えて、オブジェクト o を返します。あなたはとても才能のある人です、私はあなたを尊敬します。黙って集める<_<
以上が新しいことについて、バグから始めましょうの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ホットAIツール

Undresser.AI Undress
リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover
写真から衣服を削除するオンライン AI ツール。

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

Video Face Swap
完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

人気の記事

ホットツール

メモ帳++7.3.1
使いやすく無料のコードエディター

SublimeText3 中国語版
中国語版、とても使いやすい

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境

ドリームウィーバー CS6
ビジュアル Web 開発ツール

SublimeText3 Mac版
神レベルのコード編集ソフト(SublimeText3)

ホットトピック









フロントエンドのサーマルペーパーチケット印刷のためのよくある質問とソリューションフロントエンド開発におけるチケット印刷は、一般的な要件です。しかし、多くの開発者が実装しています...

スキルや業界のニーズに応じて、PythonおよびJavaScript開発者には絶対的な給与はありません。 1. Pythonは、データサイエンスと機械学習でさらに支払われる場合があります。 2。JavaScriptは、フロントエンドとフルスタックの開発に大きな需要があり、その給与もかなりです。 3。影響要因には、経験、地理的位置、会社の規模、特定のスキルが含まれます。

JavaScriptは現代のWeb開発の基礎であり、その主な機能には、イベント駆動型のプログラミング、動的コンテンツ生成、非同期プログラミングが含まれます。 1)イベント駆動型プログラミングにより、Webページはユーザー操作に応じて動的に変更できます。 2)動的コンテンツ生成により、条件に応じてページコンテンツを調整できます。 3)非同期プログラミングにより、ユーザーインターフェイスがブロックされないようにします。 JavaScriptは、Webインタラクション、シングルページアプリケーション、サーバー側の開発で広く使用されており、ユーザーエクスペリエンスとクロスプラットフォーム開発の柔軟性を大幅に改善しています。

同じIDを持つ配列要素をJavaScriptの1つのオブジェクトにマージする方法は?データを処理するとき、私たちはしばしば同じIDを持つ必要性に遭遇します...

この記事の視差スクロールと要素のアニメーション効果の実現に関する議論では、Shiseidoの公式ウェブサイト(https://www.shisido.co.co.jp/sb/wonderland/)と同様の達成方法について説明します。

Console.log出力の違いの根本原因に関する詳細な議論。この記事では、Console.log関数の出力結果の違いをコードの一部で分析し、その背後にある理由を説明します。 �...

JavaScriptを学ぶことは難しくありませんが、挑戦的です。 1)変数、データ型、関数などの基本概念を理解します。2)非同期プログラミングをマスターし、イベントループを通じて実装します。 3)DOM操作を使用し、非同期リクエストを処理することを約束します。 4)一般的な間違いを避け、デバッグテクニックを使用します。 5)パフォーマンスを最適化し、ベストプラクティスに従ってください。

フロントエンドのVSCodeと同様に、パネルドラッグアンドドロップ調整機能の実装を調べます。フロントエンド開発では、VSCODEと同様のVSCODEを実装する方法...
