是否可以扩展javascript对象,然后在使用后"擦除"扩展名?

miu*_*ock 5 javascript

有时我想为JS字符串添加行为,例如

String.prototype.camelize = function () {
    return this.replace (/(?:^|[-])(\w)/g, function (, c) {
        return c ? c.toUpperCase () : '';
    });
};
Run Code Online (Sandbox Code Playgroud)

然而,人们普遍认为修改原始类型是一个可怕的想法.

我可以遵循哪些模式暂时将函数分配给类型并在使用后删除?或者类似于ruby的'class << obj',只修改一个对象的原型?

编辑:这样做的关键是能够使用类似的语法

name = s.camelize();

要么

if(s.hyphenize().length <8);

所以请不要打扰静态功能的方法.

此外,这个问题实际上更侧重于如何操纵js对象以更少的副作用来做更多事情.

gle*_*ron 3

您可以完全按照您所描述的方式进行操作 - JavaScript 对象只是一组属性,其中一些是函数。因此,如果您可以创建:

String.prototype.camelize = function () {
   return this.replace (/(?:^|[-])(\w)/g, function (, c) {
      return c ? c.toUpperCase () : '';
   });
};
Run Code Online (Sandbox Code Playgroud)

那么你同样可以调用:

String.prototype.camelize = null;
Run Code Online (Sandbox Code Playgroud)

一旦你这样做了,你的串线能力camelize就被消除了。

现在,我确信您有充分的理由想要这样做,但我无法想象您所提议的事情是正确的做法。要以更惯用的方式执行类似的操作,您可以创建一个包装字符串并提供函数的类型camelize,或者您可以将该函数绑定到类的实例 - 您甚至可以将其从实用函数库中删除到您的类中。随意使用函数是 JavaScript 的强大功能之一。

请注意,如果您正在编写 JavaScript,那么您对实用函数的厌恶将迫使您进行大量的削减。您可能需要把一些先入之见放在一边,直到您掌握了该语言的基础(有些人可能称之为“好的部分”),然后当您对它有更强的把握时再重新审视它们。并不是说你不能用 JavaScript 编写正确的代码,而是它与你使用过的其他语言不同,你必须让你的实践和哲学适合该语言,而不是试图强迫该语言成为你先入为主的想法。 。每个人一开始都会这样做,JavaScript 非常灵活,几乎可以工作,但是随着您的继续学习以更惯用的方式使用它,您会获得巨大的回报。