一昨日、あるネチズンが私に「オブジェクトとは何ですか?」と尋ねるメッセージを残しました。ここ 2 日間、TreeView コントロールの再構築に忙しかったため、返信が間に合わず本当に申し訳ありませんでした。今日は時間をかけて、JavaScript におけるオブジェクトとは何なのかを見てみましょう。オブジェクトと関数の関係は何ですか?間違っていたら修正を歓迎します。
個人的なメッセージではありますが、匿名でお送りいただいてもお咎めはございませんので、何かありましたらお知らせください。
jsのオブジェクトとは一体何なのでしょうか?
最初、私は Object が js 内のすべてのオブジェクトのプロトタイプだと思っていました。
ただし、alert(Object.constructor) には関数が表示されます。 Function...
これは、Object のプロトタイプが Function? であることを意味します。
しかし、問題が再び発生します。
Function.prototype.read=function(){};//拡張関数プロトタイプ
for(var i in Object)alert(i)//読み取りを表示し、Object のプロトタイプが Function
Object.prototype.read=function(){} であることをさらに確認します;//Object のプロトタイプを拡張します
for(var i in Function)alert(i)//読み取りを表示、Function のプロトタイプは Object? ? ? ?
オブジェクトとは一体何でしょうか?クラスとしてのオブジェクトと関数は同じものですか?
この友人は、JavaScript がオブジェクトベースの言語である (JavaScript には適切なクラスが含まれていない) ため、コンストラクター、プロトタイプ、および関数を混同しました。実は、Object はすべてのオブジェクトのプロトタイプであるとも言えますが、これは Object.prototype という JavaScript のプロトタイプ言語機能ではなく、デザインパターンの Prototype Pattern におけるプロトタイプの概念を指します。
では、JavaScript におけるオブジェクトとは正確には何でしょうか? Script56.chm (公式 M$ チュートリアル) には次のように書かれています: すべての JScript オブジェクトに共通の関数を提供します。さて、わかりますか?理解しているはずなのに、まだ理解できていないようです @_@。データ構造を見ると、オブジェクト (Object のインスタンス) は順序付けされていないコレクションであり、C++ のマップ、C# のハッシュテーブル、Java のハッシュマップに似た構造です。これには、JavaScript 言語システムによって割り当てられたプリミティブ値が含まれています。これは何を意味しますか? Object には valueOf というメソッドがあり、その機能は指定されたオブジェクトの元の値を返すことです。これは Script56 にもあり、システム オブジェクトの戻り結果の valueOf をリストした表もあります。つまり、配列、ブール値、日付、関数、数値などのオブジェクトは、実際にはすべてオブジェクトから来ており、それらの祖先もすべてオブジェクトです。これらはさまざまな言語機能を表します。たとえば、配列には自動的に管理される長さ属性があり、ブール値には true または false の値のみがあり、日付は時間構造を表し、関数は実行可能です。これらはすべて、元の型 (valueOf) によって与えられる機能です。 )。オブジェクトは実際には単なる概念です。つまり、すべての組み込み型は一連の共通のメソッドとプロパティ (動作および状態とも呼ばれます) から抽象化されているということを意味します。これらの特性がオブジェクトです。実際、Object はプログラミングではあまり役に立ちません。私たちは皆、Object のインスタンス オブジェクトを使用し、その後 Object のコレクション機能 (expando) を使用して、オブジェクトを必要なものに拡張します。 Object.prototype の場合、特定の型にはそれぞれ独自のプロトタイプがあり、追加するプロトタイプ メソッドのほとんどは特定の型用であるため、実際にはあまり役に立ちません。
プロトタイプに加えて、オブジェクトにはコンストラクターという非常に重要な属性もあります。これは、前述したオブジェクトの展開を完了するために使用され、JavaScript を使用して OOP をシミュレートするための基礎でもあります。 JavaScript のすべては Object であるため、コンストラクターもオブジェクトですが、元の型は Function です (Object.constructor.valueOf() を実行して取得: function Function() { [ネイティブ コード] })。もちろん、逆に、すべての JavaScript オブジェクトがコンストラクター属性を持っているわけではなく、一部の組み込みオブジェクトにはコンストラクターがありません。
オブジェクトと関数の関係に関しては、これは良いテストコードではないと思います: Function.prototype.read=function(){};//拡張関数プロトタイプ
for(var i in Object)alert(i)//読み取りを表示し、Object のプロトタイプが Function
Object.prototype.read=function(){} であることをさらに確認します;//Object のプロトタイプを拡張します
for(var i in Function)alert(i)//読み取りを表示、Function のプロトタイプは Object?
これらの 4 行のコードは、JavaScript のプロトタイプの原理を説明し、OO プログラミングのプロトタイプ継承方法をシミュレートするために使用されます。しかし、これらはオブジェクトと関数の関係を明確に説明することはできません。 JavaScript
のさまざまな関数について簡単に説明します。
ネイティブ オブジェクト: 実行ホストに依存しない JavaScript 言語によって提供されるオブジェクト。一部は Global や Math などの組み込みオブジェクトです。また、一部はスクリプト実行環境で作成され、使用されます (配列、ブール値など)。 、日付、関数、数値、オブジェクト、正規表現、エラー。
組み込みオブジェクト: Global オブジェクトや Math など、実行ホストに依存しない JavaScript 言語によって提供される組み込みオブジェクトはすべてネイティブ オブジェクトです。
ホスト オブジェクト: ホスト環境に依存する JavaScript 言語によって提供されるオブジェクト。すべての非ネイティブ オブジェクト オブジェクトは、IE のウィンドウ、WScript の wscript インスタンス、ユーザー作成クラスなどのホスト オブジェクトです。