重命名javascript中的内置原型方法

Rename builtin prototype method in javascript

本文关键字:原型 方法 内置 javascript 重命名      更新时间:2023-09-26

今天有人问了我一个很意外的问题。我知道string.repeat(number)在javascript中重复字符串到上述数字。例子。

"Father".repeat(3)

应该打印

FatherFatherFather

我被要求做同样的事情,但不是使用.repeat,我应该使用我的新方法,如strRepeater,以这样的方式。

"Father".strRepeater(3)

应该等于

"Father".repeat(3);

请问我该怎么做?

有三个选项:

  1. 为原型创建别名:

    String.prototype.strRepeater = String.prototype.repeat;
    
  2. 为原型创建包装器:

    String.prototype.strRepeater = function() {
      return this.repeat.apply(this, arguments);
    };
    
  3. 创建自己的方法:

    String.prototype.strRepeater = function(times) {
      var res = "";
      for (var i = 0; i < times; i++) {
        res += this;
      }
      return res;
    };
    

虽然添加到原型中的其他答案是完全正确的,但它们也是一个坏习惯。

如果在原型中添加任何东西,你应该使用Object.defineProperty(),这样它就不会作为方法的成员出现(即,for...in循环将显示成员,但不正确添加时)。

虽然这不是String原型的要求,但养成坏习惯并想知道为什么事情不能正常工作总是一个坏主意…

所以添加方法的安全方法是:
Object.defineProperty(String.prototype, "strRepeater", {
    value: function(number) {
        return this.repeat(number)
    }
};

或者更安全:

if (!String.prototype["strRepeater"]) {
    Object.defineProperty(String.prototype, "strRepeater", {
        value: function(number) {
            return this.repeat(number)
        }
    };
}

从技术上讲,这将它设置为默认的enumerator: false, configurable: falsewriteable: false -这意味着"不,你不能列出我,删除我,或更改我"。

试试这个:

String.prototype.strRepeater = function(number) {
  return this.repeat(number)
};
console.log("Father".strRepeater(3));

解释:

  • String.prototype.strRepeater添加你的函数到String对象
  • this.repeat(number)将使用this中的当前字符串调用repeat内置函数,参数为number
  • return返回.repeat()strRepeater()之外的结果