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)
由于symbol是string(原始的,不可变的)和object(标识)的混合,因此根据定义可以没有对象属性命名冲突.
正常对象反射不受符号影响:
Object.getOwnPropertyNames(Array.prototype).indexOf("empty"); // -1
Run Code Online (Sandbox Code Playgroud)
但是ES2015的反思Reflect.ownKeys(Array.prototype)是.
所以这个问题主要是关于我们将来如何使用Reflect.ownKeys和Object.getOwnPropertySymbols未来的问题.
是的。
“不要修改不属于你的东西”规则有两个部分:
您可能会导致名称冲突,并且可能会破坏他们的代码。
通过触摸不属于您的内容,您可能会意外覆盖其他库使用的内容。这会以意想不到的方式破坏他们的代码。
您可以创建紧密的依赖关系,它们可能会破坏您的代码。
通过将您的代码如此紧密地绑定到某个其他对象,如果它们做出一些重大更改(例如删除或重命名该类),您的代码可能会突然崩溃。
使用符号可以避免#1,但您仍然会遇到#2。通常不鼓励像这样的类之间的紧密依赖。如果另一个类被冻结,您的代码仍然会损坏。这个问题的答案仍然适用,只是原因略有不同。
您希望专注于松散绑定依赖项以支持更好的测试(松散绑定更容易模拟)和更容易维护(一些明显的连接更容易记录和更新)。
需要明确的是:名称冲突只是紧密绑定的依赖项引起的问题的一个症状。