問題タブ [ecmascript-harmony]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
javascript - ECMAScript6のグローバルスコープの`this`
ES6ドラフトを自分で調べてみましたが、どこを見ればよいかわかりません。
this
ES6で必然的にグローバルオブジェクトを参照しているかどうかを誰かに教えてもらえますか?また、このオブジェクトにはグローバルスコープと同じメンバーがありますか?
ES5に答えることができれば、それも役に立ちます。
グローバルスコープthis
では、ブラウザやNodeなどの他のほとんどのES環境のグローバルオブジェクトを指します。それが仕様で定義された動作なのか、それとも実装者が追加した拡張動作なのか(そして、この動作がES6実装でも継続するのか)を知りたいだけです。さらに、グローバルオブジェクトは常にグローバルスコープと同じものですか?それとも違いはありますか?
更新-知りたい理由:基本的に、ES5および6でグローバルオブジェクトを確実に取得する方法を理解しようとしています。これwindow
はブラウザーに固有であるため信頼できません。またglobal
、環境に固有であるため信頼できません。ノードのように。this
Nodeでモジュールスコープで参照できることは知ってmodule
いますが、それでもglobal
グローバルスコープで参照できると思います。クロス環境ES5および6に準拠した方法で、グローバルオブジェクトを取得したい(可能な場合)。私がグローバルスコープで知っているすべての環境でそれが行われているように見えますthis
が、それが実際の仕様の一部であるかどうかを知りたいです(そして、私が慣れていない可能性のある環境全体で非常に信頼できます)。
また、グローバルスコープとグローバルオブジェクトが仕様で同じものであるかどうかも知る必要があります。言い換えると、グローバルスコープのすべての変数は?と同じになりglobalobject.variable_name
ますか?
アップデート2-私がやろうとしていること:
ES5環境用にいくつかのES6シムを開発しました。(1)ES6ビルトインがすでに存在するかどうかを確認して、可能な場合はシムの代わりに使用できるようにし、(2)シムをグローバルスコープに追加する(ビルドされている場合)ための最良の方法を知りたいです。 insはまだ存在していません。
現在、私はこのパターンに従っています:
(1)には他にもいくつかの可能性がありますが、結局のところ、グローバルスコープで使用せずにグローバルスコープに何かを追加する方法が必要ですvar
(これは、ビルトインをチェックする前にオーバーライドするためです。var
巻き上げる[少なくともナイーブなケースでは、おそらく私もステートメントを間接的にすることができますか?])eval
。var
コードをstrictモードで実行できるようにして、問題を悪化させたいと思います。
ES5仕様により、間接的eval
にグローバルスコープでコードを実行することを発見しました。だから私は少なくともそれをすることができます。私の質問はthis
、グローバルスコープに入る場合です。(1)そのオブジェクトのプロパティをチェックすると、ビルトインがグローバルスコープにすでに存在するかどうかがわかりますか?(2)そのオブジェクトにプロパティを追加すると、グローバルスコープに変数を追加できますか?
javascript - Ember.js オブジェクトオブザーバーは ES6 Harmony Object.observe と同等ですか?
オブジェクト内の新しい観察 ES6 機能を見て、Ember と ES6 は同等なのか異なるのか疑問に思いました。Ember でWatchjsポリフィルを安全に使用できますか?
node.js - Coffeescriptでハーモニーを有効にする方法は?
jsコードを実行する方法は次のとおりです。
次に、CoffeeScriptに移動します。だから私はそれをそのように実行しようとします:
そしてそれは失敗します。--harmony
このオプションを渡すにはどうすればよいですか?
javascript - ES6: パブリック シンボルとプライベート シンボル
ECMAScript 6 でシンボルをパブリックまたはプライベートとして指定する方法についての議論を探しています。
私が理解しているように、プライベート シンボルは次のようなパターンを使用して作成されます。
items
しかし、シンボルをパブリックとして指定するにはどうすればよいでしょうか? パブリック シンボルは ES6 で可能になりますか、それとも非公開のみになりますか (Object.getOwnPropertyNames
たとえば、表示されません)? さらに、パブリック シンボルは既定で列挙可能になりますか (に表示されますObject.keys
)?
誰か私を関連情報にリンクしてもらえますか?
javascript - ES.Nextでライブラリを書く方法
私は ES.Next についてよく読んでいますが、ES.Next モジュールについて質問があります。今回は、すべての JavaScript プログラマーが無名関数で JavaScript ライブラリを作成します。jQueryのようなもの:
アンダースコア:
しかし、JavaScript がモジュールを取得すると、すべてがどのように変化するのでしょうか?
または、モジュールも匿名関数に書き込む必要がありますか? グローバル変数はどうですか?そして、ES.Next が登場すると、すべての JavaScript コーディング スタイルはどのように変化するのでしょうか?
javascript - JavaScriptの動的サービスロケーター?
Harmonyプロキシ(Node.js)を使用してJavaScriptで記述された動的サービスロケーターを取得しようとしています。基本的に、新しいコンテナを作成します。
そうすれば、従来のサービスロケーターのように値を設定して取得できるようになります。
サブオブジェクトのように機能する名前空間を持つこともできます。
問題は動的エイリアスにあります。
エイリアスを作成すると、従来のオブジェクトのように操作できる新しいプロキシオブジェクトが作成されますが、これはメソッドのエイリアスget()
ですset()
。
それ以外の:
エイリアスを使用すると、次を使用します。
問題は深い名前空間にあります。アクセスしようとしているとしましょう。App.Hello.World.Controller
これは、プロキシを一度に1つの名前空間を通過し、一度にすべてを通過するわけではないためです(完全な名前空間のように)。ユーザーがサービスロケーターに格納されている値を取得するために呼び出しているApp.Hello
かどうか、またはユーザーがより深い名前空間にアクセスし続けたいかどうかをどのように知ることができますか?あなたはできません(私が試したことから)。
これを達成する他の方法はありますか?
App.Hello.World
より深い名前空間にアクセスする場合はプロキシ、またはサービスロケーターに格納されている値のいずれかを返す構文を持つ。
今、私は2つのオプションを扱うための規則をまとめました。値を取得するために単数形の名前を使用し、プロキシを返すために複数形を使用します。これはあまり効果的ではないため、簡単な「ハック」でした。
(説明や詳細情報が必要な場合は、私に知らせてください)
javascript - CoffeeScriptクラスとnosuchmethod
基盤となるJavascriptエンジンにHarmonyプロキシが存在すると仮定すると、CoffeeScriptスーパークラスを拡張して、クラスがnoSuchMethodメソッド(またはmethodMessing)を定義できるようにするにはどうすればよいでしょうか。
クラス(またはそのスーパークラス)に要求されたメソッドがない場合、そのメソッドは名前と引数リストを使用して呼び出されます。
javascript - ES5アレイ機能をサポートするために通常のオブジェクトを拡張する際の問題
私はずっと前から、ネイティブ配列と通常のオブジェクトの間の境界線を完全に曖昧にして、ES5で取得した配列と同じ機能でオブジェクトを拡張するだけでなく、両側のメソッドのカスタムパッケージとバンドルすることを望んでいました。
賢い人々のカップルは、これらのパラダイムの変化について考えました。アンガス・クロルが記事javascript-object-keys-finallyで言及したように:
「さらに、配列と通常のオブジェクトの間の境界線が曖昧になると(カスタムゲッターとセッターによって支援されます)、非数値識別子とアクセスの両方の長所を享受する一般的な「配列のような」オブジェクトの成長が見られる可能性があります。 Array.prototypeによって定義された豊富なAPIセット。EcmaScript5は、1つのタイプで定義されているが、どのタイプでも使用できるジェネリックメソッドを導入することで、この傾向を先取りしたようです。」
途中で、彼は記事にコード化されたものを取得します: extending-objects-with-javascript-getters
このアプローチは私にとって非常に興味深いものです。しかし、それはまた、いくつかの深刻な問題に苦しんでいるようです!
元のmyObjモデルをいくつかの新しいプロパティで拡張してみませんか?
extendAsArray
プロパティに関する更新を行うために、すべてのプロパティ変更を実行する必要がlength
ありますか?プロパティが変更された場合、
length
関連するのはプロパティだけではありません。配列のようなプロパティ要求は間違いなく未定義であることが判明するため、配列インデックスも更新する必要があります。そうするときそれから
/li>
それに応じてAngusのコードを変更したので、length
リクエストに応じてプロパティの自動更新をサポートします。
length
問題は、プロパティが変更、追加、または削除されたときに、オブジェクトの配列インデックスをそのプロパティと一緒に更新するにはどうすればよいかということです。
使用する必要がありますObject.watch
か?
そして、まだ解決されていない質問があります。一貫した方法でオブジェクトに対してもそれを作成した、私自身のシミングされていないユーティリティライブラリに干渉する方法は?
私は両方のタイプに同じコードベースを使用しています:z.Object({}).mapEvery
同じことをしますz.Object([]).mapEvery
JQueryやアンダースコアについても言及しないでください。私は両方のタイプのメソッドの包括的なカスタムリストを持っており、おそらくシムなしの標準で完成した標準を使用するつもりであり、それをリファクタリングするつもりはありません!
javascript - 古典的な継承を使用してプロキシ オブジェクトを構築するための JavaScript パターン
確定ではありませんが、ES6 Proxies を試しています。私の目標は、継承チェーンを持つプロキシ オブジェクトを作成するためのコンストラクター関数 (以下に示すような従来の継承を利用する関数) を持つことです。
以下は賢明に見えますか?アイテムを作成し、コンストラクターからプロキシを返します。(連鎖の目的で) インスタンスへの参照を返すメソッドは、代わりにプロキシへの参照を返す必要があります。そうしないと、連鎖中にプロキシが失われます。
目標は、('new' キーワードを介して) プロキシ化されたオブジェクトを構築することです。これは、従来の継承チェーンの製品である可能性があります。
次号。Item プロトタイプを Backbone.Events で拡張するとどうなるか考えてみてください。これらのインポートされたメソッドは、this
代わりに返されthis.proxy
ます。これを回避するにthis
は、代わりに を返すために、インポートされたすべてのメソッドをラップして返す必要がありproxy
ます。これは面倒でエラーが発生しやすいようです。Proxy の抽象化を利用するには多くの配線が必要ですが、これは私には適切ではないように思えます。
Proxy のコンセプトは気に入っていますが、その実用性に関心があります。たぶん、目標を達成するためのより良い練習が欠けているのでしょうか?
編集:
この例は単純化しすぎているため、なぜそれが必要なのかを説明できませんでした。
プロキシを使用する最終的な目標は、多重継承を可能にすることです。特定のプロキシ オブジェクトに複数の動作 (モジュール) をミックスインできるようにしたいと考えています。また、気まぐれに動作を簡単に分解できるようにしたいと考えています。
プロキシを使用することで、Proxy オブジェクトでメソッドへのアクセスを管理し、必要に応じて mixin に情報を渡すことができます。基本的に、これによりアスペクト指向プログラミングが改善されます。アスペクトでは、通常、関数をラップして置き換えます。場合によっては、特定のメソッドがいくつかの側面によってラップおよび再ラップされることがあります。AOP の問題点は、この方法でオブジェクトを変更すると、再ラップによってその側面が埋もれてしまう可能性があるため、その側面を 1 つだけ削除するのは容易ではないことです。
プロキシにはこの問題はありません。代わりに、ミックスインを配列に配置できます。プロキシは、これらの mixin で見つかったメソッドへのディスパッチを処理します (複数のメソッド、したがって複数の継承であっても)。その後、アンミックス動作は、その配列から mixin を削除するのと同じくらい簡単です。
プロキシの問題は、メソッドが (連鎖の目的で) オブジェクト自体への参照を返すことは一般的な方法ですが、元のメソッドのいずれかがそのオブジェクトへの参照を返すことを本当に望んでいないことです (したがって、バイパスプロキシ)、代わりにプロキシを返す必要があります。