検索

object.observeの紹介

キーテイクアウト

    O.Oとも呼ばれる
  • object.observeは、ブラウザでオブジェクト変更検出をサポートするために、ECMAScript 7の一部としてJavaScriptに追加する機能です。それは、その周りにラッパーを作成せずにオブジェクトで直接動作し、パフォーマンスに使いやすく、有益です。
  • 観察()メソッドは、オブジェクトの変更を探すために使用できるオブジェクト上で定義された非同期静的メソッドです。 3つのパラメーターを受け入れます。観察されるオブジェクト、変更が検出されたときに呼び出されるコールバック関数、および監視される変更の種類を含むオプションの配列を受け入れます。
  • 観測配列はオブジェクトの観察に似ており、唯一の違いは、オブジェクトの代わりにarray.observeを使用してオブザーバー関数を登録する必要があることです。 オブジェクトまたは配列の登録されたオブザーバーは、それぞれobject.unobserve()または、array.unobserve()を使用して削除できます。この方法は、削除するオブジェクトまたは配列とコールバックの2つのパラメーターを受け入れます。
  • 双方向のデータバインディングは、クライアント側アプリケーションの重要な機能の1つになりました。データバインディングがなければ、開発者はモデルに変更があるときはいつでも、多くのロジックに対処してデータにデータに手動で結合する必要があります。ノックアウト、Angularjs、EmberなどのJavaScriptライブラリは双方向の結合をサポートしていますが、これらのライブラリは、変更を検出するために異なる手法を使用しています。
  • ノックアウトとエンバーは観測可能性を使用します。オブザーバブルは、モデルオブジェクトのプロパティにラップされた関数です。これらの関数は、対応するオブジェクトまたはプロパティの値が変更されるたびに呼び出されます。このアプローチはうまく機能し、すべての変更を検出して通知しますが、機能に対処する必要があるため、プレーンJavaScriptオブジェクトを使用する自由を取り除きます。
  • Angularは、変更を検出するために汚いチェックを使用します。このアプローチはモデルオブジェクトを汚染しません。モデルに追加されたすべてのオブジェクトに対してウォッチャーを登録します。これらのウォッチャーはすべて、Angularのダイジェストサイクルが始まるたびに実行され、データに変更がある場合はいつでも実行されます。これらの変更は、対応するウォッチャーによって処理されます。モデルは、ラッパーがその周りに作成されていないため、まだ単純なオブジェクトのままです。しかし、この手法は、ウォッチャーの数が増えるにつれてパフォーマンスの低下を引き起こします。
  • object.observe?
とは何ですか

object.observe、a.k.a。o.oは、ブラウザでオブジェクト変更検出をサポートするために、ecmascript 7の一部としてJavaScriptに追加する機能です。 ES7はまだ完了していませんが、この機能はBlinkベースのブラウザ(ChromeおよびOpera)ですでにサポートされています。

object.observeはブラウザによってネイティブにサポートされ、その周りにラッパーを作成せずにオブジェクト上で直接動作するため、APIは使いやすく、パフォーマンスに勝ちます。 Object.Observeがブラウザによってサポートされている場合、外部ライブラリを必要とせずに双方向のバインディングを実装できます。既存の双方向の結合ライブラリのすべてが、O.Oが実装されると無駄にならないという意味ではありません。 O.Oを使用して変更を検出した後、UISを効率的に更新する必要があります。さらに、ライブラリは、すべてのターゲットブラウザがO.O.

をサポートしていない場合でも、変更検出のロジックを内部的にポリフィルフィルします。 オブジェクトのプロパティの観察

O.Oが何に適しているのかを考えたので、それが動作しているのを見てみましょう。

観察()メソッドは、オブジェクト上で定義された非同期静的メソッドです。オブジェクトの変更を探すために使用でき、3つのパラメーターを受け入れます。

    観察されるオブジェクト
  • 変更が検出されたときに呼び出されるコールバック関数
  • メソッドを使用する例を見てみましょう。次のスニペットを検討してください:

このコードでは、いくつかのデータを使用してリテラルオブジェクトを作成しました。また、オブジェクトの変更を記録するために使用するObserveCallback()という名前の関数を定義しました。次に、O.Oを使用して、変更の観察を開始します。最後に、オブジェクトにいくつかの変更を実行しました

コンソールに出力が表示されている場合、3つの変更のすべてが検出されて記録されていることがわかります。次のスクリーンショットは、スニペットによって生成された結果を示しています:
<span>var person = {
</span>  <span>name: 'Ravi',
</span>  <span>country: 'India',
</span>  <span>gender: 'Male'
</span><span>};
</span>
<span>function observeCallback(changes){
</span>  <span>console.log(changes);
</span><span>};
</span>
<span>Object.observe(person, observeCallback);
</span>
person<span>.name = 'Rama';  // Updating value
</span>person<span>.occupation = 'writer';  // Adding a new property
</span><span>delete person.gender;  // Deleting a property</span>

o.oは非同期に実行され、すべての変更が発生し、呼び出されたときにコールバックに渡すことをグループ化します。したがって、ここでは、オブジェクトに適用された3つの変更に対して3つのエントリを受け取りました。ご覧のとおり、各エントリは、プロパティの名前の変更、古い値、変更のタイプ、および新しい値を持つオブジェクト自体で構成されています。

前のコードのライブデモを以下に報告します(結果を確認するためにコンソールを開くことを忘れないでください):

object.observeの紹介 CodepenのSitePoint(@SitePoint)のペンEMKVEBを参照してください

コードでは、検索する変更の種類を指定していなかったため、追加、更新、削除が観察されます。これは、次のように、観察方法の3番目のパラメーターを使用して制御できます。

<span>var person = {
</span>  <span>name: 'Ravi',
</span>  <span>country: 'India',
</span>  <span>gender: 'Male'
</span><span>};
</span>
<span>function observeCallback(changes){
</span>  <span>console.log(changes);
</span><span>};
</span>
<span>Object.observe(person, observeCallback);
</span>
person<span>.name = 'Rama';  // Updating value
</span>person<span>.occupation = 'writer';  // Adding a new property
</span><span>delete person.gender;  // Deleting a property</span>

通知の登録

Observe()メソッドは、オブジェクトに追加された直接プロパティで行われた変更を検出できます。ゲッターとセッターを使用して作成されたプロパティの変更を検出することはできません。これらの特性の動作は著者によって制御されるため、変更検出も著者が所有する必要があります。この問題に対処するには、notifier(object.getNotifier()を介して利用可能)を使用して、プロパティで行われた変更を通知する必要があります。

次のスニペットを検討してください:

<span>Object.observe(person, observeCallback, ['add', 'update']);</span>
トッドタイプは、2つの特性を持つコンストラクター機能です。それらに加えて、object.definePropertyを使用してブロックされたブロックが追加されます。この例では、このプロパティで定義されたセッターは簡単なものです。典型的なビジネスアプリケーションでは、いくつかの検証を実行し、検証が失敗した場合に値を設定しない場合があります。しかし、私は物事をシンプルにしたかったのです。

最後のメモとして、私たちの例では、更新がある場合にのみ通知が送信されることがわかります。
ブロックされたプロパティに加えられた変更は、Chrome開発者ツールで次の結果を生成します。

この例のライブデモを以下に報告します(結果を確認するためにコンソールを開くことを忘れないでください):

CodepenのSitePoint(@SitePoint)によるPen NPZGOOを参照してください。object.observeの紹介

複数の変更を観察します

時々、2つ以上のプロパティが何らかの方法で変更された後に実行する計算がある場合があります。これらの両方の変更を通知者を使用して個別に通知することはできますが、両方の値が変更されていることを示すために、カスタムタイプ名で単一の通知を送信する方が良いでしょう。これは、notifier.performchange()メソッドを使用して実行できます。この方法は、3つの引数を受け入れます

カスタムタイプの名前

名前

変更を実行するコールバック関数。この関数から返される値は、変更オブジェクトで使用されます

変更が適用されるオブジェクト

  • 上記のクラスにdoned doned doneという名前の新しいプロパティを追加しましょう。このプロパティの値は、TODOアイテムが完了しているかどうかを指定します。完了した値がtrueに設定されている場合、プロパティの値を真に設定する必要があります。
  • 次のスニペットはこのプロパティを定義しています:
  • PerformChangeのコールバック内のロジックが実行されると、変更が渡されたカスタム変更タイプで変更が通知されます。このタイプは、object.observeではデフォルトでは観察されません。カスタムタイプの変更を観察するようにO.Oに明示的に依頼する必要があります。次のスニペットには、TODOオブジェクトの変更されたO.Oが表示され、追加および更新タイプとともにカスタムタイプの変更が観察されます。
    <span>var person = {
    </span>  <span>name: 'Ravi',
    </span>  <span>country: 'India',
    </span>  <span>gender: 'Male'
    </span><span>};
    </span>
    <span>function observeCallback(changes){
    </span>  <span>console.log(changes);
    </span><span>};
    </span>
    <span>Object.observe(person, observeCallback);
    </span>
    person<span>.name = 'Rama';  // Updating value
    </span>person<span>.occupation = 'writer';  // Adding a new property
    </span><span>delete person.gender;  // Deleting a property</span>

    上記のスニペットは、設定が行われる前に、ブロックされたtrueにブロックされた値を設定します。そのため、カスタム変更タイプの通知を送信します。次のスクリーンショットには、カスタムタイプで返される変更オブジェクトの詳細を示しています。

    この例のライブデモを以下に報告します(結果を確認するためにコンソールを開くことを忘れないでください):object.observeの紹介

    CodepenのSitePoint(@SitePoint)のペンyyexgdを参照してください

    arraysの観察

    アレイの観測は、オブジェクトの観察に似ています。唯一の違いは、オブジェクトの代わりにarray.observeを使用してオブザーバー関数を登録する必要があることです。次のスニペットはこれを示しています:

    この例のライブデモを以下に報告します(結果を確認するためにコンソールを開くことを忘れないでください):

    CodepenのSitePoint(@SitePoint)のペンgggezqを参照してください。
    <span>Object.observe(person, observeCallback, ['add', 'update']);</span>

    登録されたオブザーバーの削除

    オブジェクトまたは配列の登録されたオブザーバーは、それぞれobject.unobserve()または、array.unobserve()を使用して削除できます。このメソッドは、オブジェクトまたは配列の2つのパラメーターと、削除するコールバックを受け入れます。したがって、この方法を使用するには、コールバックの参照が必要です。

    結論

    O.Oがすべてのブラウザで完全にサポートされると、すべてのクライアントサイドライブラリで変更検出が標準化されます。 Aureliaはすでにそれを使用し始めました。Angular2のChange Detection Library、WatchTower.jsはO.Oを内部的に使用し、Emberは将来の変更検出にも使用します。 Angular 2とAureliaには、O.Oがネイティブに利用できない場合、フォールバックにポリーフィルが実装されています。

    クライアント側の双方向のバインディングに関する未来は、ブラウザにこの素晴らしい追加を行うことで、より明るくなります。他のブラウザがより早く追いつくのを楽しみにしています!

    <span>function <span>TodoType</span>() {
    </span>  <span>this.item = '';
    </span>  <span>this.maxTime = '';
    </span>  
      <span>var blocked = false;
    </span>  
      <span>Object.defineProperty(this, 'blocked', {
    </span>    <span>get:function(){
    </span>      <span>return blocked;
    </span>    <span>},
    </span>    <span>set: function(value){
    </span>      <span>Object.getNotifier(this).notify({
    </span>        <span>type: 'update',
    </span>        <span>name: 'blocked',
    </span>        <span>oldValue: blocked
    </span>      <span>});
    </span>      blocked <span>= value;
    </span>    <span>}
    </span>  <span>});
    </span><span>}
    </span>
    <span>var todo = new TodoType();
    </span>
    todo<span>.item = 'Get milk';
    </span>todo<span>.maxTime = '1PM';
    </span>
    <span>console.log(todo.blocked);
    </span>
    <span>Object.observe(todo, function(changes){
    </span>  <span>console.log(changes);
    </span><span>}, ['add', 'update']);
    </span>
    todo<span>.item = 'Go to office';
    </span>todo<span>.blocked = true;</span>
    object.observe

    に関するよくある質問(FAQ)

    Object.observeが廃止されたのはなぜですか。関数内で行われた変更を観察することができず、オブジェクトのプロトタイプに加えられた変更を追跡することもできませんでした。さらに、大きなオブジェクトの変更を追跡するために多くのリソースが必要だったため、パフォーマンスの点では非効率的であることがわかりました。非推奨は、プロキシや反射などのES6に新機能の導入に影響されました。これは、オブジェクトの変化を観察して対応するためのより効率的な方法を提供します。 ES6プロキシは、オブジェクト上の基本操作の動作をカスタマイズする方法を提供します。プロキシは、ターゲットオブジェクトとハンドラーオブジェクトの2つのパラメーターで作成されます。ハンドラーオブジェクトは、ターゲットオブジェクト上のさまざまな操作の「トラップ」を定義します。これらの操作が実行されると、ハンドラーの対応するトラップがトリガーされ、カスタム動作を実行できます。これにより、プロキシはオブジェクトの変化を観察して反応するための強力なツールになります。それらは、オブジェクトの変化を観察し、反応するためのより柔軟で強力な方法を提供します。プロキシを使用すると、プロパティの変更だけでなく、幅広い操作のカスタム動作を定義できます。また、プロキシは、特に大きなオブジェクトを扱う場合、object.observeよりも優れています。さらに、プロキシはES6標準の一部です。つまり、すべての最新のブラウザによってサポートされています。

    プロジェクトでObject.Observeを使用できますか?まだObject.observeを使用してください。プロジェクトでは、それは強く落胆しています。 object.observeは廃止され、JavaScript標準から削除されました。つまり、維持されなくなり、すべてのブラウザーによってサポートされていないことを意味します。非推奨機能を使用すると、プロジェクトの互換性の問題やその他の問題につながる可能性があります。 ES6プロキシなどの代替品やMobxやvue.jsなどのライブラリを使用することをお勧めします。JS。プロキシには、object.observeコールをプロキシオブジェクトに置き換えることが含まれます。オブジェクトのプロパティの変更を観察する代わりに、プロキシのハンドラーオブジェクトで観察する操作のトラップを定義します。これには、コードのリファクタリングが含まれる場合がありますが、オブジェクトの変化を観察するためのより柔軟で効率的な方法を提供します。ES6プロキシを使用することのパフォーマンスへの影響は何ですか?

    ES6プロキシは、特に大きなオブジェクトを扱う場合、一般にObject.Observeよりも効率的です。ただし、他の機能と同様に、慎重に使用する必要があります。アプリケーション内のすべてのオブジェクトのプロキシを作成すると、パフォーマンスの問題につながる可能性があります。必要に応じてプロキシを使用し、ハンドラーオブジェクトを可能な限り軽量に保つことが最善です。彼らにはいくつかの制限があります。たとえば、配列の長さ特性の変更を観察するために使用することはできません。また、プロキシは、オブジェクトのプロトタイプの変更を観察する方法を提供しません。ただし、これらの制限は、反射などのES6の他の機能を使用することでしばしば回避できます。 .jsは、オブジェクトの変化を観察するための独自のメカニズムを提供します。たとえば、MOBXは観察可能なプロパティと計算値を使用して変更を追跡し、VUE.JSはリアクティブデータモデルを使用します。これらのライブラリは、オブジェクトの観察のための高レベルのAPIを提供し、生のES6プロキシよりも使いやすくなります。 JavaScriptは、言語の継続的な進化とライブラリとフレームワークの開発によって形作られる可能性があります。 ES6プロキシや反射などの機能は、オブジェクトの変化を観察して反応するための強力なツールを提供し、MobxやVue.JSなどのライブラリがこれらのツールに基づいて、オブジェクト観測用の高レベルAPIを提供します。言語とエコシステムが進化し続けるにつれて、オブジェクトの変化を観察するためのより効率的で柔軟な方法が見られることが期待できます。

以上がobject.observeの紹介の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
JavaScript、C、およびブラウザの関係JavaScript、C、およびブラウザの関係May 01, 2025 am 12:06 AM

はじめに私はあなたがそれを奇妙に思うかもしれないことを知っています、JavaScript、C、およびブラウザは正確に何をしなければなりませんか?彼らは無関係であるように見えますが、実際、彼らは現代のウェブ開発において非常に重要な役割を果たしています。今日は、これら3つの間の密接なつながりについて説明します。この記事を通して、JavaScriptがブラウザでどのように実行されるか、ブラウザエンジンでのCの役割、およびそれらが協力してWebページのレンダリングと相互作用を駆動する方法を学びます。私たちは皆、JavaScriptとブラウザの関係を知っています。 JavaScriptは、フロントエンド開発のコア言語です。ブラウザで直接実行され、Webページが鮮明で興味深いものになります。なぜJavascrを疑問に思ったことがありますか

node.jsは、型を使用してストリーミングしますnode.jsは、型を使用してストリーミングしますApr 30, 2025 am 08:22 AM

node.jsは、主にストリームのおかげで、効率的なI/Oで優れています。 ストリームはデータを段階的に処理し、メモリの過負荷を回避します。大きなファイル、ネットワークタスク、リアルタイムアプリケーションの場合。ストリームとTypeScriptのタイプの安全性を組み合わせることで、パワーが作成されます

Python vs. JavaScript:パフォーマンスと効率の考慮事項Python vs. JavaScript:パフォーマンスと効率の考慮事項Apr 30, 2025 am 12:08 AM

PythonとJavaScriptのパフォーマンスと効率の違いは、主に以下に反映されています。1)解釈された言語として、Pythonはゆっくりと実行されますが、開発効率が高く、迅速なプロトタイプ開発に適しています。 2)JavaScriptはブラウザ内の単一のスレッドに限定されていますが、マルチスレッドおよび非同期I/Oを使用してnode.jsのパフォーマンスを改善でき、両方とも実際のプロジェクトで利点があります。

JavaScriptの起源:その実装言語の調査JavaScriptの起源:その実装言語の調査Apr 29, 2025 am 12:51 AM

JavaScriptは1995年に発信され、Brandon Ikeによって作成され、言語をCに実現しました。 2。JavaScriptのメモリ管理とパフォーマンスの最適化は、C言語に依存しています。 3. C言語のクロスプラットフォーム機能は、さまざまなオペレーティングシステムでJavaScriptを効率的に実行するのに役立ちます。

舞台裏:JavaScriptをパワーする言語は何ですか?舞台裏:JavaScriptをパワーする言語は何ですか?Apr 28, 2025 am 12:01 AM

JavaScriptはブラウザとnode.js環境で実行され、JavaScriptエンジンに依存してコードを解析および実行します。 1)解析段階で抽象的構文ツリー(AST)を生成します。 2)ASTをコンパイル段階のバイトコードまたはマシンコードに変換します。 3)実行段階でコンパイルされたコードを実行します。

PythonとJavaScriptの未来:傾向と予測PythonとJavaScriptの未来:傾向と予測Apr 27, 2025 am 12:21 AM

PythonとJavaScriptの将来の傾向には、1。Pythonが科学コンピューティングの分野での位置を統合し、AI、2。JavaScriptはWebテクノロジーの開発を促進します。どちらもそれぞれのフィールドでアプリケーションシナリオを拡大し続け、パフォーマンスをより多くのブレークスルーを行います。

Python vs. JavaScript:開発環境とツールPython vs. JavaScript:開発環境とツールApr 26, 2025 am 12:09 AM

開発環境におけるPythonとJavaScriptの両方の選択が重要です。 1)Pythonの開発環境には、Pycharm、Jupyternotebook、Anacondaが含まれます。これらは、データサイエンスと迅速なプロトタイピングに適しています。 2)JavaScriptの開発環境には、フロントエンドおよびバックエンド開発に適したnode.js、vscode、およびwebpackが含まれます。プロジェクトのニーズに応じて適切なツールを選択すると、開発効率とプロジェクトの成功率が向上する可能性があります。

JavaScriptはCで書かれていますか?証拠を調べるJavaScriptはCで書かれていますか?証拠を調べるApr 25, 2025 am 12:15 AM

はい、JavaScriptのエンジンコアはCで記述されています。1)C言語は、JavaScriptエンジンの開発に適した効率的なパフォーマンスと基礎となる制御を提供します。 2)V8エンジンを例にとると、そのコアはCで記述され、Cの効率とオブジェクト指向の特性を組み合わせて書かれています。3)JavaScriptエンジンの作業原理には、解析、コンパイル、実行が含まれ、C言語はこれらのプロセスで重要な役割を果たします。

See all articles

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

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

AI Clothes Remover

AI Clothes Remover

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

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

Video Face Swap

Video Face Swap

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

ホットツール

SecLists

SecLists

SecLists は、セキュリティ テスターの究極の相棒です。これは、セキュリティ評価中に頻繁に使用されるさまざまな種類のリストを 1 か所にまとめたものです。 SecLists は、セキュリティ テスターが必要とする可能性のあるすべてのリストを便利に提供することで、セキュリティ テストをより効率的かつ生産的にするのに役立ちます。リストの種類には、ユーザー名、パスワード、URL、ファジング ペイロード、機密データ パターン、Web シェルなどが含まれます。テスターはこのリポジトリを新しいテスト マシンにプルするだけで、必要なあらゆる種類のリストにアクセスできるようになります。

SAP NetWeaver Server Adapter for Eclipse

SAP NetWeaver Server Adapter for Eclipse

Eclipse を SAP NetWeaver アプリケーション サーバーと統合します。

AtomエディタMac版ダウンロード

AtomエディタMac版ダウンロード

最も人気のあるオープンソースエディター

SublimeText3 中国語版

SublimeText3 中国語版

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

ZendStudio 13.5.1 Mac

ZendStudio 13.5.1 Mac

強力な PHP 統合開発環境