2017-03-29 16 views
0

にコンストラクタに変数名を引いてはここでは例のコンストラクタオブジェクトのインスタンス化

function AnObject(a, b){ 
    this.a = a; 
    this.b = b; 
} 

だとそれのインスタンス化

var example = new AnObject('test', 'test'); 

は、コンストラクタは、プロパティ.name

があるとしていたと言うことができますとにかくオブジェクトの名前をインスタンス化された変数の名前に設定するようにコンストラクタをビルドしますか?上記の場合

、名前はexample

だろう - EDIT - 私はこれを達成しようとしています

理由は、可能な限り「D.R.Y」となることです。私は必要がないしたい

var example = new ObjectWithName('example'); 

答えて

1

いいえ、恐れ入りますが、それは不可能です!

右から左に文var example = new AnObject('test', 'test');が評価されます。したがって、最初にnew AnObject('test', 'test')が評価されます。次に、それが返す値はvar exampleに割り当てられます。

このため、右から左への評価を、あなたAnObjectコンストラクタは、その戻り値は、それが評価されていたときに、変数exampleに割り当てることが起こっていることを知ることができる方法はありません。

+0

JS Hoistingの問題を取り除くのに '厳格にする 'とすればどうなりますか? (あるいは 'var example;' 'example = new AnObject ...') – Panomosh

+1

@Panomosh:いずれのアプローチでも違いは見えません。戻り値がどのように割り当てられるのかをコンストラクタが把握するのに役立ちません。 –

+0

OK、それが "右から左へ"の潜在的な回避策であるかどうか疑問に思っています:) – Panomosh

1

は、それはそれがでインスタンス化されたことを、変数の名前に、オブジェクトの名前を設定するようにコンストラクタを構築するためにとにかくはありますか?

あなたは

new AnObject('test', 'test') 

で新しいオブジェクトを作成すると、これはその後、ちょうど直接使用することができるオブジェクト参照、その結果:

(new AnObject("test","test")).a 

または

new AnObject('test', 'test') 
を破棄し

または他のオブジェクトプロパティに割り当てられました:

myotherobject["b"]=new AnObject('test', 'test') 

またはアレイに押し込ま:一度

a=b=c=d=e = new AnObject('test', 'test'); 

myarr.push(new AnObject('test', 'test')) 

または複数の変数に割り当てられ、コンストラクタは、オブジェクト(参照どのように知ることができる方法はありません)が使用されるか、または割り当てられる変数の名前がわかります(単純な変数代入の場合)。

つまり、オブジェクトを作成し、結果のオブジェクト参照で何かを行うということは、2つの完全に独立したアクションです。

var example = new AnObject('example','test','test') 

をしたり、それを達成することができます方法はありません

example.name="example" 

に後でそれを設定します。

だから、明示的に引数としてコンストラクタに「名前」の値を渡さない限り。

+1

私はあなたの答えを読んだので、私はその質問を理解しました。 @Panomoshこれはコンストラクタ自身で行うのは本当に不可能です。 –

関連する問題