【问题标题】:Pass arguments to string.prototype extension in javascript将参数传递给 javascript 中的 string.prototype 扩展
【发布时间】:2020-11-07 22:06:51
【问题描述】:

我使用 string.prototype 来链接我网站上的文本段落。在某些网站上,我想添加不同的注释,因此想传递一个额外的参数来链接。

我最初的想法是这样做。

function linkifyText() {
    
    var uglyLinksPattern = /\[(.*?)\]/gim; // match all letters between square brackets
                
    if(!String.linkify) {
        String.prototype.linkify = function(note) {
            var textInput = this;    
            return textInput.replace(uglyLinksPattern, '<a target="_blank" rel="noopener nofollow" href="$&">$&</a>' + note);            
        }
    }
    return uglyLinksPattern
}
        
function linkifyDialogue (text) {    
    linkifyText();
    var note = 'Ad';        
    var linkedText = String.linkify.call(text, note);
    $('#textElem').html(linkedText);        
}

我找到了一些使用callapply 的教程。但是,我无法将其转移到我的案例中,并希望获得有关如何将参数传递给 string.prototype 属性的答案。那么有什么诀窍呢?

【问题讨论】:

  • 您要定义String.linkify(静态方法)还是String.prototype.linkify
  • String.prototype.linkify
  • 那么您正在测试 if 中的错误内容。
  • 不知道为什么要捕获 var textInput = this,而您可以改用 this.replace。还鉴于现在是 2020 年,为什么不const uglyLinksPattern?尝试使用letconst 而不是var
  • 好吧,你说得有道理。 textInput 是为了提高可读性。

标签: javascript string prototype


【解决方案1】:

您尝试实现它的方式有点奇怪(无意冒犯)。你可以让这更简单。见:

//Do this just once
String.prototype.linkify=function(note) {
    return this.replace(/\[(.*?)\]/gim,"<a target='_blank' rel='noopener nofollow' href='$1'>$1</a>"+note);
};

function linkifyDialogue(text) {    
    var note="Ad",        
        linkedText=text.linkify(note);
    $('#textElem').html(linkedText);        
}

所有字符串都已经是对象了。如果您向原型添加方法,则无需使用call()apply(),除非您确实需要(即使用this 的不同值调用它,将值数组作为不同的参数传递,等等.).

【讨论】:

  • 谢谢。所以这是整个函数的非常简单的形式。其中有电子邮件地址、伪模式、降价模式等。有些已经转义了文本,有些没有...字符串原型是在构造函数中定义的,并且必须在不同的实例中调用...所以,它长得像这样,在我的帖子中看起来有点夸张。但是,如果我想在另一个函数中调用 linkify 中的 string.prototype,如何将变量传递给它?
  • 你用prototype定义,你不用它打电话。
  • 只有一个字符串原型。您所做的每一项更改都会立即在整个窗口中可用。因此,如果您想从其他地方调用它,它将可用。在代码的不同部分重新定义 linkify 是没有意义的。如果您需要它根据上下文具有不同的行为,您可以:a)添加另一个参数来告诉它要做什么(String.prototype.linkify=function(note,somethingElse,whatever)),或者b)根本不使用String.prototype并创建一个类来包含所有不同的文本处理方法。
猜你喜欢
  • 2014-11-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-08
相关资源
最近更新 更多