2016-08-26 9 views
2

私はちょうど私がJavaのバックグラウンドを持っている...Javascriptに「安全でない公開」がありますか?

class Team { 
    constructor(id, eventHandler) { 
     this.id = id; 
     this._eventHandler = eventHandler; 
     this._eventHandler.trigger("NewTeam", this); // my concerning line 
    } 
} 

を次のJavaScriptコードを書きました。 Javaでは、コンストラクタ( "安全でない文書")からオブジェクトへの参照を共有することは危険です。これは、オブジェクトが有効な状態になる前に他のスレッドがオブジェクト上で動作する可能性があるためです。

Javascriptでも危険ですか?それは悪い練習とみなされますか?

私は1つの問題のみ考えることができます:Teamを拡張したい場合は、追加のプロパティをeventHandler.trigger("NewTeam",__)に表示することは難しいでしょう。

+3

JavaScriptはシングルスレッドです。 – Pointy

+1

もちろん、JavaScriptでも参照を共有する前に初期化を完了する必要がありますが、コンストラクタについては何も特別なことはありません。 – Bergi

+1

@Bergi - サブクラスがありますローカル初期化ではコンストラクタに関する考慮事項がありますが、コンストラクタ固有の初期化ではサブクラスを実行できません。 – jfriend00

答えて

2

JavaScriptはシングルスレッドなので(ここでは動作していないWebWorkerを除く)、ここでJavaと言いたいことはJavaScriptには当てはまりません。コンストラクタと同時に他のコードは実行されません。これは、Javascriptのシングルスレッドとイベント駆動の性質を大幅に単純化したものの1つです。

イベントを同期的にトリガしたり、関数呼び出しを行ったり、未処理のオブジェクトをそのイベントハンドラまたは関数呼び出しに渡したりする場合は、未完成のオブジェクト参照を他のコードに渡すため、コンストラクタを完成させる前に実行されます。

渡すオブジェクトが有効な状態になっている限り、これは問題ではありませんが、未完成のオブジェクトを渡した場合は、本当に問題が発生する可能性がありますセンスプログラミング、スレッド化または並行性とは関係ありません。あなたは脆弱性を作成している

class Team { 
    constructor(id, eventHandler) { 
     this.id = id; 
     this._eventHandler = eventHandler; 
     this._eventHandler.trigger("NewTeam", this); // my concerning line 
    } 
} 

:あなたの特定のケースで


Teamがサブクラス化されている場合は、this._eventHandler.trigger("NewTeam", this);を呼び出し、サブクラスが必ずコンストラクタを終了する前にthisを渡します。特定の実装に応じて、これは問題である可能性があるため、練習が常に安全であるとは限りません。 .trigger()が次の目盛り(setImmediate()またはnextTick()などを使用して呼び出すことができる場合は、呼び出される前にオブジェクトとサブクラスが常に作成されるため、常に安全です)

関連する問題