ホームページ > 記事 > ウェブフロントエンド > JavaScript オブジェクトの 2 つのカテゴリは何ですか?
JavaScript には 2 種類のオブジェクトがあります: 1. ホスト オブジェクト (JavaScript ホスト環境によって提供されるオブジェクトであり、その動作はホスト環境によって完全に決定されます); 2. 組み込みオブジェクトは、 JavaScript 言語によって提供されるオブジェクト。
このチュートリアルの動作環境: Windows7 システム、JavaScript バージョン 1.8.5、Dell G3 コンピューター。
JavaScript では、オブジェクトはホスト オブジェクトと組み込みオブジェクトの 2 つのタイプに分類できます。
ホスト オブジェクト: JavaScript ホスト環境によって提供されるオブジェクト。その動作はホスト環境によって完全に決定されます。
組み込みオブジェクト: JavaScript 言語によって提供されるオブジェクト
組み込みオブジェクト: 標準で指定され、自動的に作成されるオブジェクト インスタンスJavaScript ランタイムが作成されるとき。
ネイティブ オブジェクト: Array や RegExp などの組み込みコンストラクター、または特別な構文を通じてユーザーが作成できるオブジェクト。
通常のオブジェクト: {} 構文、オブジェクト コンストラクター、またはクラス キーワード定義クラスによって作成されたオブジェクト。プロトタイプによって継承できます。
JavaScript ホスト オブジェクトはあらゆる種類の奇妙なものですが、フロントエンドにとって最もよく知られているものは間違いなく次のホストです。ブラウザ環境。ブラウザ環境では、グローバル オブジェクトがウィンドウであり、ドキュメントなどのウィンドウ上に多くのプロパティがあることは誰もが知っています。実際、グローバル オブジェクト ウィンドウのプロパティの一部は JavaScript 言語から取得され、一部はブラウザ環境から取得されます。グローバル オブジェクトのプロパティは JavaScript 標準で指定され、Window オブジェクトの他のプロパティはさまざまな W3C 標準で指定されます。ホスト オブジェクトは、固有のオブジェクトとユーザー作成可能なオブジェクトの 2 つのタイプに分けられます。たとえば、document.createElement は一部の DOM オブジェクトを作成できます。ホストはいくつかのコンストラクターも提供します。たとえば、新しい Image を使用して img 要素を作成できます。
組み込みオブジェクトは標準で指定されており、作成されますJavaScript ランタイムを使用すると、オブジェクト インスタンスが自動的に作成されます。組み込みオブジェクトは JavaScript コードが実行される前に作成され、多くの場合、基本ライブラリのように機能します。先ほど述べた「クラス」は、実際には固有オブジェクトの一種です。 ECMA 標準は、150 個の組み込みオブジェクトを含む組み込みオブジェクトのリストを提供します。
言語自体のコンストラクターを通じて作成できる JavaScript のオブジェクトを、ネイティブ オブジェクトと呼びます。 JavaScript 標準では、30 を超えるコンストラクターが提供されています。私の理解とさまざまなアプリケーション シナリオに従って、ネイティブ オブジェクトを次のカテゴリに分類します。
これらのコンストラクターを通じて、 new 操作を使用して新しいオブジェクトを作成できるため、これらのオブジェクトをネイティブ オブジェクトと呼びます。これらのコンストラクター機能のほとんどすべては、純粋な JavaScript コードでは実装できず、クラス/拡張構文を使用して継承することもできません。これらのコンストラクターによって作成されるオブジェクトのほとんどは、プライベート フィールドを使用します。例:
Error: [[ErrorData]] Boolean: [[BooleanData]] Number: [[NumberData]] Date: [[DateValue]] RegExp: [[RegExpMatcher]] Symbol: [[SymbolData]] Map: [[MapData]]
これらのフィールドにより、プロトタイプの継承メソッドが適切に機能できなくなるため、これらすべてのネイティブ オブジェクトは特定の機能またはパフォーマンスのためのものであると考えることができます。そして「特権オブジェクト」を設計しました。
オブジェクトの一般的な分類については前に紹介しました。JavaScript では、オブジェクトを別の観点から見ることができます。オブジェクトを使用して関数とコンストラクターをシミュレートします。実際、JavaScript はこのタイプのオブジェクト用にプライベート フィールド メカニズムを予約し、抽象関数オブジェクトとコンストラクター オブジェクトの概念を規定しています。
関数オブジェクトの定義は、[[call]] プライベート フィールドを持つオブジェクトであり、コンストラクター オブジェクトの定義は、プライベート フィールド [[construct]] を持つオブジェクトです。
JavaScript は、オブジェクト シミュレーション関数の設計を使用して、一般的なプログラミング言語の関数を置き換えます。これらの関数は、他の言語の関数と同様に呼び出してパラメーターを渡すことができます。 「[[call]] プライベート フィールドを持つオブジェクト」を提供するホストは、JavaScript 関数呼び出し構文でサポートできます。
任意のオブジェクトは [[call]] を実装するだけで済み、関数オブジェクトであり、関数として呼び出すことができます。 [[construct]] を実装している場合、それはコンストラクター オブジェクトであり、コンストラクターとして呼び出すことができます。
JavaScript の実行環境を提供するプログラマーの場合、フィールドが準拠している限り、上で説明したホスト オブジェクトと組み込みオブジェクト (シンボル関数など) は関数とコンストラクターをシミュレートできます。
もちろん、ユーザーが function キーワードを使用して作成した関数は、関数とコンストラクターの両方である必要があります。ただし、それらが示す行動上の影響は同じではありません。
ホスト オブジェクトと組み込みオブジェクトの場合、[[call]] (関数として呼び出される) と [[construct]] (コンストラクターとして呼び出される) の実装は、常に一貫しているわけではありません。
对于用户使用 function 语法或者 Function 构造器创建的对象来说,[[call]]和[[construct]]行为总是相似的,它们执行同一段代码。我们看一下示例。
function f(){ return 1; } var v = f(); //把f作为函数调用 var o = new f(); //把f作为构造器调用
这样的规则造成了个有趣的现象,如果我们的构造器返回了一个新的对象,那么 new 创建的新对象就变成了一个构造函数之外完全无法访问的对象,这一定程度上可以实现“私有”。
function cls(){ this.a = 100; return { getValue:() => this.a } } var o = new cls; o.getValue(); //100 //a在外面永远无法访问到
除了上面介绍的对象之外,在固有对象和原生对象中,有一些对象的行为跟正常对象有很大区别。
它们常见的下标运算(就是使用中括号或者点来做属性访问)或者设置原型跟普通对象不同,这里我简单总结一下。
Array:Array 的 length 属性根据最大的下标自动发生变化。
Object.prototype:作为所有正常对象的默认原型,不能再给它设置原型了。
String:为了支持下标运算,String 的正整数属性访问会去字符串里查找。
Arguments:arguments 的非负整数型下标属性跟对应的变量联动。
模块的 namespace 对象:特殊的地方非常多,跟一般对象完全不一样,尽量只用于 import 吧。
类型数组和数组缓冲区:跟内存块相关联,下标运算比较特殊。
bind 后的 function:跟原来的函数相关联。
【相关推荐:javascript视频教程】
以上がJavaScript オブジェクトの 2 つのカテゴリは何ですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。