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

bob*_*bob 9 javascript symbols prototype ecmascript-6

这是主要的意见是内置的Javascript原型不应该被延长(或以任何方式改变):

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

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

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

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

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

Object.getOwnPropertyNames(Array.prototype).indexOf("empty"); // -1
Run Code Online (Sandbox Code Playgroud)

但是ES2015的反思Reflect.ownKeys(Array.prototype)是.

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

ssu*_*ube 1

是的。

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

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

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

  2. 您可以创建紧密的依赖关系,它们可能会破坏您的代码。

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

使用符号可以避免#1,但您仍然会遇到#2。通常不鼓励像这样的类之间的紧密依赖。如果另一个类被冻结,您的代码仍然会损坏。这个问题的答案仍然适用,只是原因略有不同。

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

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