2016-10-07 14 views
0

私は最近three.jsプロジェクトを再構成しました。すべてのオブジェクトが全く同じジオメトリとマテリアルでレンダリングされているように見える問題が発生しました。私は、デバッガでこのコンストラクタに問題を追跡:Object.definePropertyはコンストラクタで何もしません

function Geometry() { 
    Object.defineProperty(this, 'id', { value: GeometryIdCount() }); 
    this.uuid = exports.Math.generateUUID(); 
    ... 

ChromeはObject.definePropertythisオブジェクトにはプロパティを示していない、と物事は後でそれを使用しようとするとidundefinedとして戻ってきます。しかし、私がthree.jsを使用して作成した古いプロジェクトをデバッグすると、idは呼び出し後にデバッガのthisに定義されます。

Object.definePropertyは何も起こらない原因は何ですか?私がnode.js requireを使用してJavascriptから3つのES6 importをTSコンパイラでTypescriptから呼び出すようにしたのですが、なぜこのコンストラクタにこの効果があるのか​​はわかりません。

答えて

1

だけ「idは未定義戻ってくる」と言って、必ずしも私はあなたが直接Object.definePropertyコールの後thisのプロパティを見て、私はそれを説明できないことを理解しないもののObject.definePropertyは、何もしなかったことを意味するものではありません。 GeometryIdCount()が未定義を返した場合は、その値がundefinedの後になる理由を説明します。コンストラクタが完了した後、プロパティ値ではなくプロパティ自体が未定義であることを確認しましたか?

それは言葉の代わりに「使用」の「活用」、または多分活字体、ES6またはthree.jsがそれを必要とするが、なぜあなたが代わりに書いていないを使用してのようなものがあります。

this.id = GeometryIdCount(); 

この意志ただし、関数が未定義を返す場合は未知数をthis.idに割り当てます。

更新: あなたの質問はexactly what Object.defineProperty doesを検索するには私を得た、そしてそれは驚くべきことであり、非常に有益でした。私がWebGLを使って作業したとき、私はthree.jsを使用しなかったので、幾何学があなたが書いた関数であると誤って思いました。

説明する方法でObject.definePropertyを呼び出すと(3番目の引数を「value」プロパティのみを持つオブジェクトに設定すると)、すべてのObjectプロパティが持つ書き込み可能な、設定可能なおよび列挙可能なプロパティを偽です。一方、文this.id = GeometryIdCount()は、これらの3つのプロパティをtrueに設定します。 three.jsの作成者は、各ジオメトリオブジェクトに一意のキーを割り当てて、ユーザーがその値を変更できないようにすることが明らかになりました。私は他の理由も見なかった。

私はあなたのプロジェクトのコピーを作成し、秘密にしておきたいもの(ここに投稿したい場合)をできるだけ避けるためにできるだけ散漫なコードを取り除くことを推奨します問題の原因を特定します。 idプロパティが作成されていないか、定義されていないというこの悪い振る舞いを再現できなくなったら、コードの削除をやめてください。小さなプログラムを作成して、Geometry.prototype.id = undefinedなどの悪いことをvar g = Geometry(...)(newキーワードなし)と呼ぶ前に問題を再現する方法を推測しようとしましたが、問題を再現できませんでした。 GeometryIdCountの動作を無効にしようとするか、またはidプロパティを作成しないようにするまでは行っていませんでした。それは意図的な妨害行為のように思われ、私はあなたがあなたの場合にそれを疑うことは疑う。

+0

私は 'GeometryIdCount'を踏んで、有効な整数を返しているようです。私は実際にあなたが書いたものにコードを変更しました、そして、それは動作します。それで3Jソースを変更する必要があるので、私が更新すればそれをやり直さなければならず、それは謎を解決しません。 – BMac

関連する問題