在node.js中,如何从另一个模块中的模块中的app.js访问函数?

我正在创build一个战舰游戏来学习node.js。 在app.js文件中,我创build了两个基于名为Users的模块的玩家,这个模块导入了一个名为Board的模块。 在Board模块内部,我有一个名为placeShip的函数。 我怎样才能从app.js访问这个placeShip函数? 因为它是我得到一个TypeError:Player1.placeShip不是一个函数。

用户模块:

var User = function() { var board = require('./Board'); return { Username: "", Gender: "", Player: "", Turn: "", Ships: { Carrier: ['C','C','C','C','C'], Battleship: ['B','B','B','B'], Cruiser: ['Z','Z','Z'], Submarine: ['S','S','S'], Destroyer: ['D','D'] }, Board: new board, Hit: function (ship,position) { var x = this.Ships[ship][position]; if(x != null && x != undefined) { this.Ships[ship][position] = 'X'; } }, OutputAll: function () { for (var item in this) { if (item == "Ships") { console.log("Ships: "); for (var ship in this.Ships) { console.log(" " + ship + ": " + this.Ships[ship]); } } else if(item != "Hit" && item != "OutputAll" && item != "Board") { console.log(item + ": " + this[item]); } } } } } module.exports = User; 

电路板模块:

 var GameBoard = function() { return { Yours: createArray(10), Mine: createArray(10), ClearBoards: function () { this.Yours = createArray(10); this.Mine = createArray(10); }, DisplayBoard: function(board){ for(var i in board){ console.log(board[i]); } } } } function createArray(length) { var table = new Array(length); for (var i = 0; i < length; i++) { table[i] = new Array(length); // Make each space a 0 for (var row = 0; row < length; row++) { table[i][row] = 0; } } return table; } function placeShip(ship,rowStart,rowEnd,colStart,colEnd) { var letter; //=====Get Ship Letter====== for (x = 0; x < ship.length; x++) { if (ship[x] != 'X') { letter = ship[x]; break; } } //=====Get Orientation======= // Ship is horizontal if (rowStart === rowEnd) { // Put the ship letter where it lies for (x = colStart; x <= colEnd; x++) { this.Board.Mine[rowStart][x] = letter; } } // Or Ship is vertical else if (colStart === colEnd) { // Put the ship letter where it lies for (x = rowStart; x <= rowEnd; x++) { this.Board.Mine[x][colStart] = letter; } } // Or Ship is diagonal else { // Put the ship letter where it lies this.Board.Mine[rowStart][colStart] = letter; for (x = 0; x < ship.length; x++) { this.Board.Mine[rowStart + 1][colStart + 1] = letter; } } } module.exports = GameBoard; module.exports.placeShip = placeShip; 

app.js:

 var http = require('http'); var fs = require('fs'); var Users = require('./public/Scripts/Users'); var Player1 = new Users; var Player2 = new Users; // When a user navigates to the site function onRequest(request, response){ console.log("User made a " + request.method + " request from " + request.url); Player1.Username = "Jamie"; Player1.Hit("Carrier", 4); console.log("Player 1 Board:========"); Player1.Board.DisplayBoard(Player1.Board.Mine); Player1.placeShip(Player1.Ships.Carrier,0,4,0,0); Player1.Board.DisplayBoard(Player1.Board.Mine); console.log("Player 2 Board:========"); Player2.Username = "Kimyl"; Player2.Board.DisplayBoard(Player2.Board.Yours); console.log("Player 1: " + Player1.OutputAll()); console.log("Player 2: " + Player2.OutputAll()); // If user asks for the home page if(request.method == 'GET' && request.url == '/' ) { console.log('Successfully requested Home Page'); // Write a header response response.writeHead(200, {"Content-Type": "text/html"}); fs.createReadStream("./public/index.html").pipe(response); } else{ send404Error(response); } } // 404 Error function send404Error(response){ // Write a header response response.writeHead(200, {"Content-Type": "text/plain"}); response.write("The page you are looking for could not be found!"); response.end(); } http.createServer(onRequest).listen(3000); console.log("Server running..."); 

我们需要使用用户模块中的电路板模块,因此最好的方法是将电路板模块作为parameter passing给用户,并要求在主文件app.js

app.js:

 var board = require("./public/scripts/board"); var Users = require("./public/scripts/Users")(board); 

用户模块

 var User = function(board){ return{ Board: new board; } } 

移动Boardfunction里面的placeShipfunction,把你的this.Board.Mine改成this.Mine

app.js可以创build一个ref的child1,child2等这ref将允许函数调用子…

app.js也可以“侦听”在child1,child2等中触发的事件

  window.addEventListener('child1.event1', function() { $ref.child2.func2(options)} 

传递式调用链是:

child1可以通过触发调度程序在其父级(app.js)中侦听的事件来调用其兄弟中的某个函数,