使用 ES6 静态函数时,我得到“没有这样的方法”

I get "no such method" when using ES6 static functions

本文关键字:方法 静态函数 ES6 使用      更新时间:2023-09-26

我正在尝试为我在 react native 中工作的项目创建一个包含静态函数的"utils"类。

我在StackOverFlow问题中阅读了有关如何创建静态函数的信息,但由于某种奇怪的原因,它对我不起作用。

//utils.js
'use strict'
export default {
  textFormat(args) {
      var s = args[0];
      for (var i = 0; i < args.length - 1; i++) {
          var reg = new RegExp("''{" + i + "''}", "gm");
          s = s.replace(reg, args[i + 1]);
      }
      return s;
  }
}

//main file
import * as Utils from './utils/utils';
/**
/...
**/
var text = Utils.textFormat(rowData.text, "<Text style={{color:'blue'}}>Hey there</Text>");

但是我不断收到此错误"Utils.textFormat 不是函数",我做错了什么?

很好,你让事情正常,但我只想添加一个更类似于你最初尝试做的解决方案,并注意你链接的 SO 问题中提出的观点。

只是不需要使用 class 来导出一堆静态方法。我不明白它将如何为代码添加功能、易用性或清晰度。实际上恰恰相反,语法看起来比导出普通的旧 ES5 样式对象更冗长,当我们将 ES6+ 甜蜜带入混合时更是如此。


您的原始实用程序模块示例工作正常。问题出在导入中。

由于您只是导出一个默认对象,因此导入它的正确方法是

import Utils from './utils/utils';
没有

括号,没有星号,只是导入的默认对象的名称,然后可以像var text = Utils.textFormat(...)一样使用它。

不过,我们可以走得更远。通过摒弃整个"导出一个默认对象"的方法,我们可以充分利用模块系统的全部功能。

utils.js:

'use strict'
function textFormat(args) {
      var s = args[0];
      ...
      return s;
}
const someOtherUtility = str => str + ' works!';
export { textFormat, someOtherUtility };

现在导出的函数可以像这样使用

import * as Utils from './utils/utils';
var text = Utils.textFormat(rowData.text, "<Text style={{color:'blue'}}>Hey there</Text>");

或者像这样

import {textFormat} from './utils/utils';
var text = textFormat(rowData.text, "<Text style={{color:'blue'}}>Hey there</Text>");

无论您喜欢哪个。

您混合了链接问题中列出的两种方法,这是行不通的。它应该是

// utils.js
export default {
  textFormat(args) {
    var s = args[0];
    for (var i = 0; i < args.length - 1; i++) {
      var reg = new RegExp("''{" + i + "''}", "gm");
      s = s.replace(reg, args[i + 1]);
    }
    return s;
  }
}

// main file
import Utils from './utils/utils';
…
var text = Utils.textFormat(rowData.text, "<Text style={{color:'blue'}}>Hey there</Text>");

// utils.js
export function textFormat(args) {
  var s = args[0];
  for (var i = 0; i < args.length - 1; i++) {
    var reg = new RegExp("''{" + i + "''}", "gm");
    s = s.replace(reg, args[i + 1]);
  }
  return s;
}

// main file
import * as Utils from './utils/utils';
…
var text = Utils.textFormat(rowData.text, "<Text style={{color:'blue'}}>Hey there</Text>");

(后者更可取)