JSFiddle - React, Tailwind, and code Playground

HTML

<div id="board"></div>

CSS

#board {
    width: 150px;
    font-size: 28px;
    font-family: Arial;
    margin: auto;
    padding-top: 25px;
}

td {
     padding: 10px;   
}

JavaScript

var Piece = function( board, val ) {
        this.board = board;
        this.val = val;
};

var Board = function(){ };
  
  Piece.prototype = {
          board: null, val: false,
      render: function(){
          return this.val ? "X" : "O"; 
      },
      click: function( e ){
           e.data.piece.val = !e.data.piece.val;
           e.data.piece.board.render();
         return false;
      }
  };
  
  Board.prototype = new Array();
  Board.prototype.render = function(){
           
           var table = $("<table></table>");
           
           for(var i=0; i < this.length; i++){
               
               var tr = $("<tr></tr>");               
               for(var j=0; j < this[i].length; j++){
                    var td = $("<td><a href='#'>" + this[i][j].render() + "</a></td>");
                    $(td).find("a").bind("click", {piece: this[i][j]}, this[i][j].click);
                    td.appendTo( tr );
               }
               
               $(tr).appendTo(table);
           }
           
          $("#board").html("");
          $("#board").append( table );
  };

  var gameBoard = new Board();
  
  for(var i=0; i < 3; i++){
      
      gameBoard.push( [] );
      for(var j=0; j < 3; j++ ){
          var val = ( Math.floor(Math.random() * 10) % 2 == 0 ) ? true : false;
          var p = new Piece( gameBoard, val );
          gameBoard[i].push( p );
      }
      
  }
  
  gameBoard.render();