Fix JS property/method collisions for fields enamed read/write
diff --git a/compiler/cpp/src/thrift/generate/t_js_generator.cc b/compiler/cpp/src/thrift/generate/t_js_generator.cc
index dfc334b..27240e4 100644
--- a/compiler/cpp/src/thrift/generate/t_js_generator.cc
+++ b/compiler/cpp/src/thrift/generate/t_js_generator.cc
@@ -1061,10 +1061,10 @@
   vector<t_field*>::const_iterator f_iter;
 
   if (gen_es6_) {
-    indent(out) << "read (input) {" << '\n';
+    indent(out) << "[Symbol.for(\"read\")] (input) {" << '\n';
   } else {
     indent(out) << js_namespace(tstruct->get_program()) << tstruct->get_name()
-        << ".prototype.read = function(input) {" << '\n';
+        << ".prototype[Symbol.for(\"read\")] = function(input) {" << '\n';
   }
 
   indent_up();
@@ -1151,10 +1151,10 @@
   vector<t_field*>::const_iterator f_iter;
 
   if (gen_es6_) {
-    indent(out) << "write (output) {" << '\n';
+    indent(out) << "[Symbol.for(\"write\")] (output) {" << '\n';
   } else {
     indent(out) << js_namespace(tstruct->get_program()) << tstruct->get_name()
-        << ".prototype.write = function(output) {" << '\n';
+        << ".prototype[Symbol.for(\"write\")] = function(output) {" << '\n';
   }
 
   indent_up();
@@ -1395,7 +1395,7 @@
                 "Thrift.TApplicationException(Thrift.TApplicationExceptionType.UNKNOWN_METHOD, "
                 "'Unknown function ' + r.fname);" << '\n' << indent()
              << "  output.writeMessageBegin(r.fname, Thrift.MessageType.EXCEPTION, r.rseqid);"
-             << '\n' << indent() << "  x.write(output);" << '\n' << indent()
+             << '\n' << indent() << "  x[Symbol.for(\"write\")](output);" << '\n' << indent()
              << "  output.writeMessageEnd();" << '\n' << indent() << "  output.flush();" << '\n'
              << indent() << "}" << '\n';
 
@@ -1447,7 +1447,7 @@
                       + "_result";
 
   indent(f_service_) << js_const_type_ << "args = new " << argsname << "();" << '\n' << indent()
-             << "args.read(input);" << '\n' << indent() << "input.readMessageEnd();" << '\n';
+             << "args[Symbol.for(\"read\")](input);" << '\n' << indent() << "input.readMessageEnd();" << '\n';
 
   // Generate the function call
   t_struct* arg_struct = tfunction->get_arglist();
@@ -1509,7 +1509,7 @@
   f_service_ << indent() << js_const_type_ << "result_obj = new " << resultname << "({success: result});" << '\n'
              << indent() << "output.writeMessageBegin(\"" << tfunction->get_name()
              << "\", Thrift.MessageType.REPLY, seqid);" << '\n' << indent()
-             << "result_obj.write(output);" << '\n' << indent() << "output.writeMessageEnd();" << '\n'
+             << "result_obj[Symbol.for(\"write\")](output);" << '\n' << indent() << "output.writeMessageEnd();" << '\n'
              << indent() << "output.flush();" << '\n';
   indent_down();
 
@@ -1562,7 +1562,7 @@
     indent(f_service_) << "}" << '\n';
   }
 
-  f_service_ << indent() << "result.write(output);" << '\n' << indent()
+  f_service_ << indent() << "result[Symbol.for(\"write\")](output);" << '\n' << indent()
              << "output.writeMessageEnd();" << '\n' << indent() << "output.flush();" << '\n';
   indent_down();
   indent(f_service_) << "});" << '\n';
@@ -1610,7 +1610,7 @@
                             " err.message);" << '\n' << indent() << "output.writeMessageBegin(\""
              << tfunction->get_name() << "\", Thrift.MessageType.EXCEPTION, seqid);" << '\n';
   indent_down();
-  f_service_ << indent() << "}" << '\n' << indent() << "result_obj.write(output);" << '\n' << indent()
+  f_service_ << indent() << "}" << '\n' << indent() << "result_obj[Symbol.for(\"write\")](output);" << '\n' << indent()
              << "output.writeMessageEnd();" << '\n' << indent() << "output.flush();" << '\n';
 
   indent_down();
@@ -2013,7 +2013,7 @@
 
 
     // Write to the stream
-    f_service_ << indent() << "args.write(" << outputVar << ");" << '\n' << indent() << outputVar
+    f_service_ << indent() << "args[Symbol.for(\"write\")](" << outputVar << ");" << '\n' << indent() << outputVar
                << ".writeMessageEnd();" << '\n';
 
     if (gen_node_) {
@@ -2152,13 +2152,13 @@
 
       indent_up();
       f_service_ << indent() << js_const_type_ << "x = new Thrift.TApplicationException();" << '\n'
-                 << indent() << "x.read(" << inputVar << ");" << '\n'
+                 << indent() << "x[Symbol.for(\"read\")](" << inputVar << ");" << '\n'
                  << indent() << inputVar << ".readMessageEnd();" << '\n'
                  << indent() << render_recv_throw("x") << '\n';
       scope_down(f_service_);
 
       f_service_ << indent() << js_const_type_ << "result = new " << resultname << "();" << '\n' << indent()
-                 << "result.read(" << inputVar << ");" << '\n';
+                 << "result[Symbol.for(\"read\")](" << inputVar << ");" << '\n';
 
       f_service_ << indent() << inputVar << ".readMessageEnd();" << '\n' << '\n';
 
@@ -2299,7 +2299,7 @@
  */
 void t_js_generator::generate_deserialize_struct(ostream& out, t_struct* tstruct, string prefix) {
   out << indent() << prefix << " = new " << js_type_namespace(tstruct->get_program())
-      << tstruct->get_name() << "();" << '\n' << indent() << prefix << ".read(input);" << '\n';
+      << tstruct->get_name() << "();" << '\n' << indent() << prefix << "[Symbol.for(\"read\")](input);" << '\n';
 }
 
 void t_js_generator::generate_deserialize_container(ostream& out, t_type* ttype, string prefix) {
@@ -2482,7 +2482,7 @@
  */
 void t_js_generator::generate_serialize_struct(ostream& out, t_struct* tstruct, string prefix) {
   (void)tstruct;
-  indent(out) << prefix << ".write(output);" << '\n';
+  indent(out) << prefix << "[Symbol.for(\"write\")](output);" << '\n';
 }
 
 /**