2017-11-04 13 views
0

プロトタイプにオブジェクトリテラルを追加しています。私は、オブジェクトのプロパティを取得し、値を配列に入れることで、これを実行しています。次に、コンストラクタを使用して配列を引数として新しいオブジェクトを作成します。なぜ適用すると、引数に使用する配列の最初の要素をスキップしますか?

唯一の問題は、新しいオブジェクトを作成するときに配列の最初の要素をスキップしているため、新しいオブジェクトの間違った値に間違った値を割り当てることです。空の。

デバッガでは、配列とコンストラクタ関数の両方が、プロパティ/要素を正しい順序で表示します。しかし、出力は正しくありません。

新しいオブジェクトのコンストラクタに引数を直接入れて新しいオブジェクトを作成することができます。しかし、これは読むのが難しいです。プロトタイプにオブジェクトを付ける別の方法がないかぎり?または、コンストラクタの準備が整った、私のデータを整理するためのちょっとした方法?

(function(root, undefined) { 
 
    var roomArray = [ 
 
    { 
 
     locationIndex: 0, 
 
     name: "North room", 
 
     description: "The room is bare, there is a smashed window on the North wall, beyond which you see a grey mist.", 
 
     exits: {north: false, south: 1, east: false, west: false, down: false, up: false} 
 
    }, 
 
    { 
 
     locationIndex: 1, 
 
     name: "Room 1", 
 
     description: "It is hard to see much here.", 
 
     exits: {north: 0, south: 3, east: 2, west: false, down: false, up: false} 
 
    }, 
 
    { 
 
     locationIndex: 2, 
 
     name: "Room 2", 
 
     description: "A bedroom.", 
 
     exits: {north: false, south: false, east: false, west: 1, down: false, up: false} 
 
    }, 
 
    { 
 
     locationIndex: 3, 
 
     name: "kitchen", 
 
     description: "A kitchen.", 
 
     exits: {north: 1, south: false, east: false, west: false, down: false, up: false} 
 
    } 
 
    ]; 
 
    
 
    // Room constructor 
 
    function Room(location, name, description, exits) { 
 
     this.location = location; 
 
     this.name = name; 
 
     this.description = description; 
 
     this.exits = exits; 
 
    } 
 
    
 
    // Create Rooms 
 
    roomArray.forEach(function(room, index) { 
 
    var convertArray = []; 
 
    for (var props in room) { 
 
     convertArray.push(room[props]); 
 
    } 
 
    eval("room_" + index + " = new (Room.bind.apply(Room, convertArray))()"); 
 
    console.log(convertArray); 
 
    console.log(eval("room_" + index)) 
 
    }); 
 
    
 
})(this);

+0

あなたの関数のパラメータが「未定義」であるのはなぜですか? –

+0

古い習慣は、 '未定義'が実際には未定義であることを保証することです。それはおそらく必要ではない、私はちょうどそのようにそれを学んだ。 – Cuckoo

答えて

1

この

root['room_' + index] = new (Function.prototype.bind.apply(Room, convertArray))(); 

や現代JavaScriptが

root['room_' + index] = new Room(...convertArray) 
+0

ありがとうございます。それは間違いなく精巧です。しかし、出力はまだ間違っています。 'location'の値は数字でなければなりません。私がコンストラクタ関数に適用している配列の最初の要素と同じです。 実際、現代版ではこの問題は修正されていますが、不思議なことに、変数名にインデックス番号を追加していません。 – Cuckoo

+0

あなたのコードのすべての私のテストの数字です –

+0

申し訳ありませんが、私はそれを正しく読んでいませんでした。現代版は完璧に動作しています。ありがとうございました。私は私のバージョンで問題を引き起こしていたものを理解していない。 – Cuckoo

1

を試してみてください。ここで

はコードがありますが問題です。 bind関数を使用していますが、コンストラクターを直接呼び出すことはありません。バインドはthisを最初のパラメータとし、applyも同様に2回入力する必要があります。

Function.bind.apply(Room, [null].concat(convertArray)) 

のようなものが動作するはず

Relevant Mozilla docs

+0

ああ、ありがとう、私は。今問題を理解して、本当に私を混乱させていました。ありがとうございました。 – Cuckoo

関連する問題