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