問題タブ [ecmascript-5]
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 - variable.Property = "test" vs Object.defineProperty(variable,"Property")
a
変数にプロパティP
(非アクセサ プロパティ)を与えたい場合、それが構成可能/列挙可能/書き込み可能かどうかは気にしません。
単純に実行する方が (考えられるすべての点で) 実際にはより有益であると 100% 確信できます。
使用する代わりに
したがって、原則として、Object.defineProperty
アクセサーを作成する必要がある場合や、プロパティの構成可能/書き込み可能/列挙可能な状態を制御したい場合を除き、これに触れるべきではありませんか?
javascript - プロトタイプnullのオブジェクトを介したECMAScript連想配列?
私はこれをやっている人をたくさん見ます
私の質問は、をハッシュとして.hasOwnProperty
使用するたびにテストするのではなく、なぜオブジェクトにtoを設定しないのですか? †</p>
Object
.__proto__
null
__proto__
非標準であることが私の注意を引きました。それはまだ質問に答えていませんが...
var foo = Object.create(null); Object.getPrototypeOf(foo);
これは元の質問ではありませんが、継承をチェックする必要があるという欠点を排除するために変更することについて何も見つかりませんか? このアプローチの何が問題なのですか。コードを高速化 (のプロパティをチェックする必要はありません) し、よりクリーンにしているようです。__proto__
null
Object
† また、.prototype
将来その子を作成する予定がある場合は、そのプロパティ。
javascript - ECMAScript の暗黙的なセミコロンと空白の解析について
実際、ECMAScript を記述するときに K&R スタイルを使用する理由として、これが引用されているのを非常によく見てきました。
これは ECMAScript または Javascript では機能しません。暗黙的なセミコロンの追加により、関数は を返しundefined
ます。しかし、私もこれをいつも見ています
そして、なぜ暗黙のセミコロンが返されないのか疑問に思っています。"BAR"
なぜbar
そこに返されるのですか?
javascript - Javascript forEach を停止するには?
私は Node.js と Mongoose で遊んでいます — 再帰関数と内部でネストされた深いコメントで特定のコメントを見つけようとしていforEach
ます。Node.js を停止する方法はありforEach
ますか? 私が理解しているように、すべてforEach
の反復は関数であり、単に行うことはできませんbreak
がreturn
、これは停止しませんforEach
。
javascript - Object.preventExtensionsは、実際には__proto__の変更を許可しますか?
Objectに追加された新機能についてMDCを閲覧していました。そのうちの1つ、、は、またはObject.preventExtensions
を使用して取得できるオブジェクトのプロトタイプへの変異を防ぐと言われています。Object.getPrototypeOf
__proto__
ただし、Chromeでは、オブジェクトのプロトタイプに変更を加えることができるようです。これは、関連するページのコードを実行するだけで確認できます。
これがわからないのでTypeError
、fixed.__proto__.oh === 'hai'
禁止されているはずなのに設定されています。のようにコーディングするときにも追加できObject.getPrototypeOf(fixed).oh = 'hai'
ます。
これは、Chromeがこの関数の解釈が異なることを意味しますか?オブジェクトのプロトタイプ(Chrome)の拡張を防ぐにはどうすればよいですか?
javascript - Object.createと直接のプロトタイプ継承
私はEcmaScript5仕様でObject.createをいじっており、多重継承型の構造を作成しようとしています。
a、b、cといういくつかの関数があるとします。プロトタイプを扱うだけで、私はこれを行うことができます:
しかし、Object.createを使用して、私はこれを行うでしょう:
どちらの方法でも同じ結果が得られると思います。
コンストラクター関数の代わりにオブジェクトに戻るので、これはちょっと不格好なようです。通常のプロトタイプの継承を行うことは、煩わしさが少なく、動作するために特別な処理を必要としないモジュラーアプリケーションにとってより理にかなっているように思われます。
私は何かが足りないのですか?コンストラクターを作成してObject.createを作成しようとする利点はありますか?または、これは既存のオブジェクトをコピーする場合にのみ役立ちますか?プロトタイプにアタッチされたプロパティと関数にのみアクセスしたいので、後でオブジェクトに追加された関数とプロパティにはアクセスしません。
または、これはどうですか(またはより良いディープコピーを使用しますが、考え方は同じです)?
javascript - Object.keys()は、組み込みオブジェクトに対してInternet Explorer 9で機能しますか?
Object.keys()メソッドは、次のようなコードで正常に機能します。
ただし、Object.keys()は、次のようなコードを持つ組み込みオブジェクトの長さゼロの配列を返します。
私は何かが足りないのですか?InternetExplorer9.0.8112.16421を使用しています。
追記:なぜこれが(たとえば)なのかはまだわかりません:
... IE9では何も生成されませんが、これは正常に機能します。
javascript - Object.defineProperty(obj、 "prop"、desc)がおかしな動作をしている
オブジェクトを定義し、その構成可能なプロパティをfalseに設定したが、他のすべての小道具をそのままにして、後でそのオブジェクトの書き込み可能な小道具をfalseに設定してからtrueに戻そうとすると、TypeErrorがスローされます。
これは私がこれを行っている方法の内訳ですが、ドット表記で1つのオブジェクトデータ記述子のみを変更し、オブジェクトリテラルでオブジェクトのすべてのデータ記述子を変更することでこれを試みましたが、どちらの形式も機能しませんでした。
仕様に役立つものは何も見つかりませんでしたが、definePropertyに関するMDCの記事には、オブジェクトプロパティが構成不能にされた後でも、書き込み可能なデータ記述子は変更できると記載されています。他のすべてはできませんが、書き込み可能です。
それで、これはChromeの何かですか、それとも私はこれを間違っていますか?
/* アップデート */
これは解決されました-仕様8.12.9セクション10.aiを読んでください
javascript - なぜ新しいのは遅いのですか?
ベンチマーク:
不変量:
テスト:
予想される速度の順に以下
new f;
g.call(Object.create(Object.prototype));
new (function() { })
(function() { return this; }).call(Object.create(Object.prototype));
実際の速度:
new f;
g.call(Object.create(Object.prototype));
(function() { return this; }).call(Object.create(Object.prototype));
new (function() { })
質問:
- インライン匿名関数
f
を交換する場合。(テスト4.)テストが遅いg
のはなぜですか?new
アップデート:
インライン化されている場合、具体的に何が原因でnew
が遅くなります。f
g
ES5仕様への参照、またはJagerMonkeyまたはV8ソースコードへの参照に興味があります。(JSCとCarakanのソースコードも自由にリンクしてください。ああ、IEチームは必要に応じてChakraソースをリークする可能性があります)。
JSエンジンのソースをリンクする場合は、それを説明してください。
javascript - JavaScript の典型的なオブジェクト指向
TL;DR:
プロトタイプの OO にファクトリ/コンストラクタが必要ですか? パラダイム スイッチを作成して、それらを完全にドロップできますか?
バックストーリー:
私は最近、JavaScript でプロトタイプの OO をいじっていましたが、JavaScript で行われた OO の 99% は、古典的な OO パターンをそれに強制していることに気付きました。
典型的な OO に対する私の見解は、それには 2 つのことが関係しているということです。メソッド (および静的データ) の静的プロトタイプとデータ バインディング。ファクトリやコンストラクタは必要ありません。
JavaScript では、これらは関数と を含むオブジェクト リテラルObject.create
です。
これは、すべてを静的な設計図/プロトタイプとしてモデル化し、できればドキュメント スタイルのデータベースに直接フックされるデータ バインディングの抽象化を行えることを意味します。つまり、オブジェクトはデータベースから取り出され、プロトタイプをデータで複製することによって作成されます。これは、コンストラクターロジック、ファクトリー、no がないことを意味しnew
ます。
サンプルコード:
疑似例は次のとおりです。
マイナーな説明:
ES5 は冗長であるため、特定のコードは冗長です。Entity
上記は設計図/プロトタイプです。データを持つ実際のオブジェクトは、 を使用して作成されObject.create(Entity, {...})
ます。
実際のデータ (この場合はコンポーネント) は、JSON ストアから直接読み込まれ、呼び出しに直接挿入されObject.create
ます。もちろん、コンポーネントの作成にも同様のパターンが適用され、合格したプロパティのみObject.hasOwnProperty
がデータベースに保存されます。
エンティティが初めて作成されるとき、それは空で作成されます{}
実際の質問:
今、私の実際の質問は
- JSプロトタイプOOのオープンソースの例?
- これは良い考えですか?
- 原型的な OOP の背後にあるアイデアや概念と一致していますか?
- コンストラクター/ファクトリー関数を使用しても、どこかでお尻を噛むことはありませんか? コンストラクタを使わなくても本当にうまくいくでしょうか。上記の方法論を使用して、それらを克服するために工場が必要な制限はありますか?