是否应该避免通过符号扩展内置Javascript原型?

时间:2016-01-12 17:03:27

标签: javascript prototype ecmascript-6 symbols

predominant opinion内置的Javascript原型不应该被扩展(或以任何方式改变):

Array.prototype.empty = function () { return this.length === 0; } // don't try that

此规则是否也适用于ES2015符号?

const empty = Symbol("empty");
Array.prototype[empty] = function empty() { return this.length === 0; }

由于symbolstring(原始的,不可变的)和object(标识)的混合,因此根据定义,没有对象属性命名冲突。

正常对象反射不受符号影响:

Object.getOwnPropertyNames(Array.prototype).indexOf("empty"); // -1

但ES2015与Reflect.ownKeys(Array.prototype)的反映是。

所以这个问题主要是关于我们将来如何使用Reflect.ownKeysObject.getOwnPropertySymbols

1 个答案:

答案 0 :(得分:2)

“不要修改你不拥有的东西”规则有两个部分:

  1. 您可能会导致名称冲突,可能会破坏他们的代码。

    通过触摸您不拥有的内容,您可能会意外覆盖其他某些库使用的内容。这会以意想不到的方式破坏他们的代码。

  2. 您可以创建严格的依赖关系,他们可以破解您的代码。

    通过将代码紧密地绑定到其他对象,如果它们做了一些重大更改(例如删除或重命名类),您的代码可能会突然中断。

  3. 使用符号将避免#1,但您仍然会遇到#2。通常不鼓励类之间的紧密依赖。如果其他类是frozen,那么您的代码仍会中断。 answers上的this question仍然适用,原因略有不同。

    您希望专注于loosely binding您的依赖项以支持更好的测试(松散绑定更容易模拟)和更轻松的维护(一些明显的连接更容易记录和更新)。

    要明确:名称冲突只是由紧密绑定的依赖项引起的问题的症状。