【问题标题】:Invoke a function without parentheses javascript调用不带括号的函数 javascript
【发布时间】:2014-03-01 08:49:13
【问题描述】:

所以我写了这个字符串函数来为句子中的每个单词添加东西

String.prototype.addStuff = function() {
    return this.replace(/ /g, "-stuff ") + "-stuff"
}

有人告诉我有一种方法可以在不使用括号的情况下对字符串调用此函数。 有人知道怎么做吗?

我尝试将函数声明用括号括起来并在末尾添加一对:

String.prototype.liu = (function() {
    return this.replace(/ /g, "-liu ") + "-liu"
})();

但这不起作用:/

【问题讨论】:

  • 你永远不会用括号括起来。你会在外部调用你的函数。
  • 如果你“被告知”,那你为什么不问问……被告知的那个人? (我唯一能想到的是一个toString 方法,当字符串输出到某处时会自动调用它。)
  • 在解析为函数的表达式(例如变量名或函数表达式)之后的括号中包含形式参数列表会导致函数被调用。没有getterssetters,没有其他方法,它们通常不可用。见ECMA-262 §11.2.3 Function Calls
  • 查看Invoking a function without parentheses 了解很多方法。

标签: javascript function prototype


【解决方案1】:

您可以使用Object.defineProperty 并提供访问器描述符

Object.defineProperty(String.prototype, 'liu', {
    get: function() {
        return this.replace(/ /g, "-liu ") + "-liu"
    }
});

"foo".liu

虽然我不知道你为什么要这么做。

【讨论】:

  • 仅在 ES5 主机中,例如IE 8 出来了。 :-(
  • 谢谢,这很有效,很酷。我在一次采访中被问到这个问题,完全被难住了。我编写了 String 函数在每个单词的末尾添加 -liu,然后面试官问我,“如果我想这样称呼它怎么办:“你好,我的名字是”.liu,它会返回“你好-liu my-liu name-liu is-liu"
【解决方案2】:

可能,您不能将整个 function 包装成 prototype 以自动调用。

现在,您可以做的是定义一个共享的functionprototype

当然,你必须打电话给它,但这总比没有答案好。

Good Read on how prototypical inheritance works

现在,你可以这样做:

yourFunc.prototype.call('yourFunc');

但您必须正确格式化它才能使其正常工作。

【讨论】:

  • 那仍然使用()
  • 如果我的函数名为 addStuff,我该怎么做? addStuff.prototype.call('addStuff') ?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-08-25
  • 2016-06-27
  • 1970-01-01
  • 1970-01-01
  • 2017-12-27
  • 1970-01-01
相关资源
最近更新 更多