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

时间:2016-10-26 01:44:25

标签: javascript

我今天被问到一个令我惊讶的问题。我知道{j}中的with open('/Users/someone/Desktop/python/sports.csv', 'r') as file1: f = set(file1) sports_label_list = [None] * 9985818 i = 0 for line in f: sports = line.split(';')[0] sports_label_list[i] = sports i = i + 1 if 'football' in line: sports_label_list[i] = 'football' if 'volley' in line: sports_label_list[i] = 'volley' if 'basketball' in line: sports_label_list[i] = 'basketball' if 'soccer' in line: sports_label_list[i] = 'soccer' i = i + 1 重复字符串。实施例。

string.repeat(number)

应打印

  

FatherFatherFather

我被要求做同样的事情,但是使用"Father".repeat(3) ,我应该像.repeat一样使用我的新方法。

strRepeater

应该等于

"Father".strRepeater(3)

请问我该怎么办?任何帮助将不胜感激。

3 个答案:

答案 0 :(得分:14)

有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;
    };
    

答案 1 :(得分:6)

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

如果向原型添加任何内容,您应该使用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: falseconfigurable: falsewriteable: false - 这会转换为&#34;不,您无法列出我,删除我,或改变我&#34;。

MDN上的

Object.defineProperty

答案 2 :(得分:5)

试试这个:

&#13;
&#13;
String.prototype.strRepeater = function(number) {
  return this.repeat(number)
};

console.log("Father".strRepeater(3));
&#13;
&#13;
&#13;

说明:

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