title: Should the extension of built-in Javascript prototypes through symbols also be avoided?
body: <p>It is the <a href="https://stackoverflow.com/questions/14034180/why-is-extending-native-objects-a-bad-practice">predominant opinion</a> that built-in Javascript prototypes should not be extended (or altered in any way):</p>
  
  <pre><code>Array.prototype.empty = function () { return this.length === 0; } // don't try that
  </code></pre>
  
  <p>Does this rule also apply to ES2015 symbols?</p>
  
  <pre><code>const empty = Symbol("empty");
  Array.prototype[empty] = function empty() { return this.length === 0; }
  </code></pre>
  
  <p>Since <code>symbol</code> is a mix of <code>string</code> (primitive, immutable) and <code>object</code> (identity) there can be no object property naming conflicts by definition.</p>
  
  <p>Normal object reflection is not affected by symbols:</p>
  
  <pre><code>Object.getOwnPropertyNames(Array.prototype).indexOf("empty"); // -1
  </code></pre>
  
  <p>But ES2015 reflection with <code>Reflect.ownKeys(Array.prototype)</code> is.</p>
  
  <p>So this question is mainly about how we'll use <code>Reflect.ownKeys</code> and <code>Object.getOwnPropertySymbols</code> in the future.</p>