JavaScript最佳实践,使用* statics扩展本机*

时间:2011-10-26 18:42:12

标签: javascript native

有些人会告诉你,将原型添加到JavaScript本机是邪恶的。例如:

String.prototype.format = function(format, replacements) {
    ...
};

现在,对于那些同意这一点的人(如果你不这样做,不回答答案 - 你的意见是N / A;这不是关于原型的讨论),是添加静态当地人的方法同样邪恶? (迄今为止,“静态”仅指一种上下文不是实例的方法。)

例如,假设创建String.prototype.format是邪恶的,将它作为 static 添加为可接受的做法吗?

String.format = function(format, replacements) {
    ...
};

如何使用静态方法扩展本机,与最佳实践相比,与使用原型扩展本机相比有何不同?要么你反对以任何方式扩展本地人,要么你不是 - 营地中是否有人静态扩展是可以接受的,而原型不是?

2 个答案:

答案 0 :(得分:1)

向本机构造函数添加静态方法不会对其他人的代码或使用所述构造函数构造对象所花费的时间产生意外影响。

但是,当您将原型方法添加到本机Constrcutor时,每个实例(甚至是为执行“test”.indexOf(“t”)等操作而创建的实例)都会产生额外的方法开销。迭代对象属性或测试功能(因为我们经常无法按类型判断对象)变得更加困难。

假设您在代码中添加String.prototype.forEach。这会泄漏到每个模块中。现在,当其他一些代码测试forEach方法时(认为它是现代浏览器中的数组),他们会得到一个字符串 - 邪恶。

答案 1 :(得分:1)

问问自己为什么扩展本地人是邪恶的。

常见原因是

  • 不能面向未来,如果标准说“应该有String.format
  • 该怎么办?
  • 不是过去证明,向原型添加可枚举属性会破坏不良代码。
  • 可能会导致混淆什么是常见的,什么是标准的
  • 可能会破坏坏代码(鸭子打字,看起来像鸭子,像是一样的qu ::抛出异常:()

这只是权衡你重视这些原因的重要性。我只关心#1(面向未来)。