4

mootoolsのドキュメントには、「Extends プロパティはクラス定義の最初のプロパティにする必要がある」と記載されています。何時間もの調査の後、mootools doc でこの行に出くわしました。

Extends を最初のプロパティとして設定すると、元の問題は解決できましたが、その理由がわかりません。

js docs によると、オブジェクト内のプロパティの順序はエンジンの実装の対象です。注文に関していかなる種類の保証も行われません。

では、なぜ mootools は順序に依存するのでしょうか? mootools のコードを読もうとしても役に立ちませんでした;)。

4

1 に答える 1

5

まず、これを理解してください: MooTools クラス コンストラクターは、渡された単純なオブジェクトを受け取り、プロパティをループします。

始めましょうimplement- https://github.com/mootools/mootools-core/blob/master/Source/Class/Class.js#L75 - は Class コンストラクターに渡されたすべてのプロパティに対して呼び出されています。これはオーバーロードされた関数です - https://github.com/mootools/mootools-core/blob/master/Source/Class/Class.js#L98を参照してください- これにより、キー -> 値ペアのオブジェクトを操作できます。ほとんどの実装ではFIFOになるoverloadSetter標準for (var key in obj)ループを使用します-キーをソートし、数値インデックスを持つキーまたは数値文字で始まるキーを返すWebkitの奇妙な傾向を無視します。ECMA 仕様はプロパティの順序を保証しません

オブジェクトのプロパティをループするとき、https://github.com/mootools/mootools-core/blob/master/Source/Class/Class.js#L100-L113Class.Mutators定義されているミューテーターを調べようとします。ExtendsImplements

拡張の場合、parentプロパティを設定し、新しいオブジェクト コンストラクターのプロトタイプも設定します - https://github.com/mootools/mootools-core/blob/master/Source/Class/Class.js#L103- L104 - これは早い段階で行う必要があります。拡張可能で、独自のカスタムミューテーターを追加できるように構築されているため、具体的には抜き取りません。in MooTools-more - おそらく唯一の解決策ではありませんが、厳格で非 DRY なシュガーとは対照的に、扱いにくいが柔軟な API として残しておく方がよいものもありますExtendsImplementsBinds

特に、物事Implementsは以前Extendsと同じImplementsように実際には壊れます...気にしないでください-私が最初に遭遇したとき、非常に昔のブログ投稿でそれを説明しました-しかし、いくつかのMooToolsコア開発者と話し、その理由が明らかになりました. 私がここで経験しなければならなかったことを参照してください: http://fragged.org/mootools-pattern-fun-class-implements-extends-at-the-same-time_1359.html

おそらく、現在は機能していない mootools-2.0 AMD ブランチ (こちら) の方が優れていました

だから - 今のところ、私たちはそれと一緒に暮らす必要があります - とにかくプライムが出るまで.

于 2013-10-15T21:11:43.273 に答える