2016-07-15 1 views
2

v8で隠されたクラスの概念について少し勉強しました。コンストラクタ内のすべてのプロパティ(プロトタイプベースの "擬似クラス"を使用している場合)を宣言し、コンストラクタの外に新しいオブジェクトを追加または追加しないでください。ここまでは順調ですね。v8で未知の値を持つプロパティを宣言する(最もパフォーマンスの高い)方法

1)しかし、あなたはタイプを知っている(あなたも変化してはならないこと)ではなく(初期)プロパティについて何?

var Foo = function() { 
    this.myString; 
    this.myNumber; 
} 

...と、後に具体的な値を割り当てるか、このように、先行「偽」の値を割り当てる方が良いでしょう。例えば

は、それが十分なこのような何かを行うことです。

var Foo = function() { 
    this.myString = ""; 
    this.myNumber = 0; 
} 

2)もう1つはオブジェクトです。時には私はただオブジェクトが固定構造を持っていない知っているが、私はハッシュマップとしてそれを使用したい。コンパイラにこのように使いたいので、最適化されていない(後で解読される)ように指示する(冗長ではない)方法はありますか?

更新ご入力のための

ありがとう!だから私は、「ベストプラクティス」として、これらの点を検討(インターネット上で多くの)あなたのコメントを読んだ後:

  • コンストラクタでクラスのすべてのプロパティを定義してくださいを
  • (も単純なオブジェクトを定義するために適用されます)
  • あなたもthatsのちょうどnullまたはundefined場合、これらのプロパティに何かを割り当てる必要が - ちょうどthis.myString;を述べることは、あなたがとにかく何かを割り当てる必要がありますので、私は「あなたができる場合には「偽」の値を割り当てることだと思う明らかに
  • 十分ではありません最終値immediaを割り当てるtlyは傷つけることができないので、コンパイラは使用するタイプをできるだけ早く「知っている」。したがって、たとえばthis.myString = "";
  • オブジェクトの場合は、事前に知っている場合は構造全体を割り当て、すぐにわからない場合はダミー値を再度割り当てます。さもなければ、例えばハッシュマップとしてオブジェクトを使用することを意図しているとき、ちょうど:this.myObject = {};をしてください。これがハッシュマップであるべきであることをコンパイラに示す価値はないと考えてください。 が本当にになりたければ、このオブジェクトにダミーのプロパティを割り当て、その後すぐにdeleteというトリックを見つけました。しかし、私はこれをしません。
  • (参照:https://www.youtube.com/watch?v=UJPdhx5zTaw&feature=youtu.be&t=25m40s)それは明らかにお勧めします小さなアレイについては、たとえば、あなたが最終的なサイズを知っている場合は特に、ので、それらを事前に割り当てる:this.myArray = new Array(4);
  • は後でないdeleteプロパティを実行してください!必要ならばnull
  • 割り当て後にタイプを変更しないでください!これにより、別の隠されたクラスが追加され、パフォーマンスが低下します。とにかくベストプラクティスだと思います。私が異なる型を持つ唯一のケースは、とにかく特定の関数の引数です。その場合、私は通常それらを同じターゲットタイプに変換します。
  • 後でプロパティを追加し続ける場合も同じです。

これは、これを行うことは、より洗練された、より組織化されたコードに頼り、ドキュメント化にも役立つとも言われています。

私が確信していることは少し残念です。コンストラクタ内で呼び出された関数(たとえば、configure()メソッドの種類)のプロパティを定義するとどうなりますか?

+0

'this.myString;を実行すると、コンパイラはおそらくあなたのために' this.myString = undefined'を実行するか、少なくとも類似したものを実行します。プロパティに値を再割り当てすると、文字通りナノ秒がかかるため、実際には問題になりますか? – adeneo

+1

ええ、私はこれが起こると思います。しかし、問題は、1)隠れたクラスに関しては十分であるか、2)意図的なタイプの_immediatly_を割り当てることが後で行うよりも良い場合です。 –

+0

1)隠されたクラスは、プロパティの検索を本当に速くするために、どこかのバックグラウンドで「隠れた」クラスを作成するV8です。新しいプロパティを追加するたびに、「隠された」クラスが再作成されます。言い換えれば、プロパティを作成する場合、プロパティの作成方法に関係なく、ほぼ同じ時間がかかります。しかし、事前にプロパティを作成しておき、後で値を割り当てるときに得られる高速検索を利用できますが、プロパティやプロパティの作成と割り当てがブラウザを構成するコードでは問題ありませんとにかく両方とも待ってください – adeneo

答えて

1

Re 1):最初のスニペットのようにプロパティを読み込むだけで、オブジェクトに何も行われません。プロパティを作成するには、それらを割り当てる必要があります。

しかし、オブジェクトのプロパティでは、プロパティを初期化する限り、どの値を初期化するかは実際問題ではありません。たとえundefinedでも問題ありません。

具体的な値は、の配列のほうが関係があります。この場合、VMはそれらを均等に保つために、正しい要素で(穴なしで)作成する必要があります。特に、Arrayコンストラクタを使用しないでください。なぜなら、それはちょうど穴を生成するからです。

Re 2):VMをトリックして辞書表現を使用する方法がありますが、VMとバージョンに依存しており、実際には信頼できません。一般に、マップとしてオブジェクトを使用するのは避けるのが最善です。 ES6以降、適切なMapクラスがあります。

+0

これは良い答えだと思っていますが、 //www.youtube.com/watch?v=UJPdhx5zTaw&feature=youtu.be&t=25m40sを使用すると、「小さな配列」を事前に割り当てることができます。ですから、この場合は 'Array'コンストラクタを使うのはいいと思います。 –

+0

@frontend_dev、well yes、trueですが、配列のサイズを静的に知ることができる場合は、代わりにダミー値を持つ配列リテラルを使用することをお勧めします。 –

関連する問題