2016-06-16 3 views
1

重複するキーの検索用語のため、これは本当に難しいです。私はこの回路を作っています。参考のため、スタイルに関しては、少し変更するかもしれないが(例えば、number_of_boardsなど)、他のものに再利用するのではなく、プロパティ名を再利用するオブジェクト(たとえば、私はしたくない大きなオブジェクトの関数としてのオブジェクトコンストラクタ

CIRCUIT_BOARD = { 
    "blankGridSquare": function(){ 
     //Returns brand new object that is one blank grid square of the map 
    } 
    , "blankMap": function(width,height){ 
     //Returns brand new object that has a bunch of blank grid squares 
    } 
    , "copyMap": function(map){ 
     //Returns new object with the same value as parameter map 
    } 
    , "newBoard": function(svg,width,height,ioPlugs,map){ 
     //Returns new object with a target svg, 
     //either a blank map or a copy of the given map, 
     //a set of ioPlugs, 
     //the electric current set up, 
     //etc. 
     //Initializes a few other things 
    } 
    // and other functions of course... 
} 

:私は1つのページに私のケルト結び目発生器と回路のゲームを持っていた場合、私はKNOT.drawCIRCUIT_BOARD.draw

そうしなければならず、ここに私の現在のセットアップのショートバージョンですすべての関数を1つの変数にまとめることを取り除きます。なぜなら、1つのページに複数のゲームを配置する柔軟性が必要だからです。私は、コンストラクタを適切に作成するには、というキーワードを使用することをお読みください。しかし、私がこれらのコンストラクタにthisを使用しようとするたびに、私は、例えばgridSquareにすべての関数が接続されている束の関数を持つマップを取得します。

したがって、問題は、複数のオブジェクトコンストラクタを、他のオブジェクトのすべてのプロパティである非インスタンスバインド関数として作成する方法です。その凝縮された質問が適切に言われているかどうかは分かりません。

+2

'new CIRCUIT_BOARD.someFunction()'を呼び出すと、その呼び出しの中で 'this'の値が新しいオブジェクトになります。呼び出しの前に 'new'を使用しないと、' this'の値は 'CIRCUIT_BOARD'オブジェクト自体になります。 – Pointy

+0

"blankMap"関数の中で 'new CIRCUIT_BOARD.blankGridSquare'を使うと、無関係な関数を使わずに空白を作ることができます。 ...テスト中... – RoboticRenaissance

+0

ありがとう、Pointy。それがまさに私が必要としていたものです。次回は、そのような情報を回答に入れるべきです。私はそれをテストしたらすぐにそれを受け入れるだろう。 – RoboticRenaissance

答えて

2

これは、モジュールが使用する正確なパターンです。たとえば:

export function FooCtor() { 
    this.stuff = 3; 
} 

はなります:オブジェクト内の(単なる関数です)コンストラクタを含む

exports.FooCtor = FooCtor; 
function FooCtor() { 
    this.stuff = 3; 
} 

は、問題が発生することはありません。

実行中の混乱、as Pointy mentionedは、newの演算子が関数呼び出し内のthisの周囲にあります。あなたがコンストラクタとして合理的に動作することができる関数に対してnewを呼び出す場合、ランタイムは、ほとんど空のオブジェクトを持つ新しいコンテキストを一緒に入れてthisに割り当て、その関数を呼び出します。それはやってとは異なり、完全ではありません:を把握するために

newInstance = FooCtor.call({}, ...args) 

スペックを通じて作業する理由起こること:スペックの§12.3.3new演算子)を皮切り

、それは言う:

メンバーエクスプレッション新規メンバーエクスプレッション個の引数

  1. 戻りEvaluateNew(MemberExpression、引数)。

EvaluateNew§12.3.3.1.1に私たちを導き、どこ3-4言う手順:

REFconstructProductionを評価した結果とします。 コンストラクタをGetValue(ref)とすると、となります。

これは、プロパティアクセサーのチェーンを経由する(foo.barfoo[bar]、何でも)。次に、同じセクションの手順9は言う:

戻り構築物(コンストラクタargListに)。

先頭へ§7.3.13に進み、建設プロセスの内部挙動。 newTargetが経過していなかった

場合、がnewTarget Fことせ:9 EvaluateNewのステップ

Constructでステップ1をトリガConstructnewTargetパラメータを指定しないありません。 §9.2.2で定義されたコンストラクタの[[Construct]]プロパティにオフ

ステップ5 Constructの手の実行、。ステップ8状態:

種類"ベース"、OrdinaryCallBindThis(F、calleeContext、thisArgument)を行う場合。

は、だから我々は5.AにthisArgumentの定義に巻き戻し:

thisArgumentはOrdinaryCreateFromConstructor(newTarget"%のObjectPrototype%" を)とします。

抽象操作OrdinaryCreateFromConstructorは、その[[通常のオブジェクトを作成します。実際に(ようやく)コンストラクタのコンテキストとして使用する新しいオブジェクトを作成する方法について行くれ、§9.1.14に私たちをバウンス

Prototype]]値は、コンストラクターのプロトタイププロパティが存在する場合はそのプロパティから取得されます。それ以外の場合は、[[Prototype]]にintrinsicDefaultProtoという名前の組み込み関数が使用されます。

この時点では、コンストラクタ関数がどのようにアクセスされたかはわかりません。 newは、コンストラクタとして理にかなった関数を取得する限り、気にしません。それを分かりやすくすると、このチェーンは新しいオブジェクトを設定して、プロトタイプをリンクするすべてのものを処理します。

+0

これはむしろ混乱しています。しかし、それは、 'new'キーワードが関数内の' this'キーワードの参照を変更するということですか?そのコンテキストから関数を削除し、新しいコンテキストを与えますか?そんな感じ?私は何年もMDNの上にw3schoolsを使った理由があります... – RoboticRenaissance

+0

私は仕様の一部を掘り起こす前に要約を少し追加しました。スペックは追いつきにくいかもしれませんが、コードのように読むと、多くの意味があります。また、*してください* w3schoolsを使用しないでください。彼らは事実上間違っている傾向があり、その例には多くの問題があります。 – ssube

+0

私は、彼らにはより複雑な情報の一部が欠けていることがわかりました。私がSVGで作ることができるすべてのものを見つけたいのであれば、代わりにMDNに行くつもりです。これは、さまざまな言語やもののそれぞれについての紹介です。私はそこで何か奇妙に間違った何かの具体的な例を見たことはありません。しかし、たとえそれがあったとしても、より新しい観客が実際に正しいサイトを持っているという誤ったコミュニケーションは、まっすぐな間違った答えよりも多くの問題を引き起こします。少なくとも、私は若い頃の私の経験でした。私は実際にJQuery APIとMDNのものを実際に読むことができるので、私はそれを好む。 – RoboticRenaissance

関連する問題