JavaScript - 作为自我调用函数的原型(IIFE)

时间:2016-09-10 23:08:04

标签: javascript

我想在String上定义一个自动调用函数

的原型
String.prototype.overEstimatedLength = (function() {
   return this.length + 12345
})()

然后像这样使用它

'hello world'.overEstimatedLength

不幸的是,这不起作用。 语法上是否可能,为什么上面的例子不起作用?

注意:我知道属性定义更合适(例如Getter),我对自我调用函数特别感兴趣。

2 个答案:

答案 0 :(得分:2)

你的例子的问题在于,实际上并没有像#34;自我调用函数那样的事情,只有" 立即 -invoked函数表达式",重点是立即

考虑这样的事情:

String.prototype.foo = alert('foo');
'foo'.foo;
'foo'.foo;

立即运行alert('foo') ,然后将结果存储在String.prototype.foo中。 。 。然后只检索几次结果(不做任何事情)。所以'foo'只会收到一次警报。

你的例子很相似;你立即调用你的函数表达式。

答案 1 :(得分:1)

您似乎正在尝试在String.prototype

上定义一个getter



Object.defineProperty(String.prototype, 'overEstimatedLength', {
  get: function() {
    return this.length + 12345;
  }
});
console.log('hello'.overEstimatedLength)




您的代码无法正常运行,因为它会立即执行您的功能并将结果分配给String.prototype.overEstimatedLength。也就是说,它与...几乎完全相同。

function myFunc() {
    return this.length + 12345
}
String.prototype.overEstimatedLength = myFunc();

以下是一种工作方式,但您将其称为函数,请注意您正在返回一个函数,以便将其分配给String.prototype



String.prototype.overEstimatedLength = (function() {
   return function() {
     return this.length + 12345;
   }
})()

console.log('something'.overEstimatedLength())