ホームページ >ウェブフロントエンド >jsチュートリアル >Javascript 書き込み可能機能の紹介_JavaScript スキル
js の機能タグについて話すとき、私はいつも少し奇妙に感じます。では、なぜこの属性について話すのでしょうか? それは、ウィンドウ オブジェクトが実際には
であることを誰もが知っているからです。ブラウザ ウィンドウのインスタンス。インスタンスであるため、このインスタンスには次のような「プロパティ」と「メソッド」が必要です。
通常、関数を使用するときは、名前、年齢などのいくつかの属性を定義し、それらに対して削除、設定、更新操作を実行することもできます。
次に、人物オブジェクトの名前は動的に変更できるため、この原則に従って、ウィンドウの下にある未定義の値も変更できるはずです。非常に興味があります。 。
未定義の値を正常に変更できなかったのに、結果はまだ予測可能ですが、なぜこのようなことが起こるのでしょうか?前の記事で述べたようなパッケージ化ではありませんが、結果を尊重する必要があります。これは、実際には、そのような結果を引き起こすために js の最下位層が何らかの操作を行ったに違いないことを意味します。 js ではデフォルトで Writable= が使用され、未定義の属性が書き込み不可になります。詳しく見てみましょう。
1: [書き込み可能] 機能
プロパティが書き込み可能かどうかについて話すとき、C# の get/set アクセサー、または readonly キーワードを思い浮かべるかもしれません。プロパティの読み取り専用操作をどのように実現するかに必ず興味があるでしょう。 js では、defineProperty メソッドを使用するだけです。
上記の例から 3 つの興味深いことがわかります。
<1>: person.name を読み取り専用フィールドに変えるために、defineProperty メソッドを使用しました。これは明らかにメソッドですが、私の考えでは、この機能は
結局、これがjsの違いです。 , js には糖衣構文がないため、プロパティの定義は、基礎となるパブリック メソッド (defineProperty) を通じてのみ定義できます。
<2>: メソッド内に書き込み可能だけでなく構成可能も表示されましたが、これは何をするのでしょうか?実際、これは基本的な設定であり、属性を削除および更新できるかどうかを js エンジンに指示します。configurable を false に設定すると、無効な操作となるため、p.Name を削除できません。
これを読むと、uniffed が削除や更新ができない理由が理解できると思います。どれも不思議なマークでできていると思いませんか?
<3>: 次に考えるべき問題は、JS エンジンがそれをどのように行うかということです。C# にも属性があり、この属性はコンパイラーによってコンパイルされた後にメタデータに記録されます。 Serializable シリアル化クラスなどの属性内の値を取得するためにリフレクションを自由に使用できます。これにより、SerializableFormat にクラスをリフレクティブに読み取る方法、どのフィールドがシリアル化できるか、そうでない場合は NonSerialized マークを使用する必要があることがわかります。
この図から、名前がシリアル化されていない機能が IL に記録されていることがわかります。js には反映がないことがわかっているため、ブレークスルーは当然、defineProperty メソッドにありますが、残念ながら、基礎となるものはわかりません。このメソッドのソース コードは具体的にはどのようなものなのか、動的に書き込み不能にするために Name フィールドにどのような処理が行われるのかはわかりません。理解に基づいて、JS エンジンの動作を推測することしかできません。