如何将构造函数参数传递给 ECMAScript 6 中的导入类?

2024-04-24

如果我将一个类导入到其他脚本中,如何使用 ES6 语法将参数传递给该类构造函数?

我想做这样的事情。我见过各种建议,例如包装函数或使用工厂模式,但是有没有更干净、更简单的方法来做到这一点?

// This is sudo code
import SomeClass from './SomeClassPath';
var thing = SomeClass(params);

我发现您的问题有些混乱,所以让我澄清一下。

在 ES6 中,您可能知道当需要导出模块时有两种策略。您可以使用默认导出 or 多次出口。让我们举一个非常基本的例子(一个简单的记录器console):

function info(msg) {
  console.info(`[Info] ${msg}`);
}

function error(msg) {
  console.error(`[Error] ${msg)`);
}

默认导出

在这里我们必须对我们的功能进行分组。在 JavaScript 中执行此操作的最惯用方法是使用对象文字(请参阅揭示模块模式):

export default {
  info(msg) {
    console.info(`[Info] ${msg}`);
  },
  error(msg) {
    console.error(`[Error] ${msg}`);
  }
};

然后,在我们的客户端代码中,我们将像这样使用这个模块:

import logger from './logger'

logger.info('Hello!');
logger.error('Oops!');

多次出口

这里我们可以独立导出我们的函数:

export function info(msg) {
  console.info(`[Info] ${msg}`);
}

export function error(msg) {
  console.error(`[Error] ${msg}`);
}

然后,在我们的客户端代码中,我们将像这样使用这个模块:

import {info, error} from './logger'

info('Hello!');
error('Oops!');

Done.

我建议您通过我们的功能示例来了解 ES6 模块系统是如何工作的。这和课堂上的情况是完全一样的......


辛格尔顿?

通过阅读评论,我看到了另一个需要澄清的困惑:辛格尔顿.

Singleton 是一种设计模式,它使得实例化一个类成为可能once。现在想象一下我们的类如下:

export default class Person {
  constructor(firstName, lastName) {
    this.firstName = firstName;
    this.lastName = lastName;
  }
};

我们可以这样使用它:

import Person from './Person';

let me = new Person('Baptiste', 'Vannesson'),
    you = new Person('David', 'Choi');

console.log(Object.is(me, you)); // false, so there are two instances of Person
console.log(me.firstName, me.lastName);  // Baptiste Vannesson
console.log(you.firstName, you.lastName); // David Choi

正如你所看到的,Person 和 Singleton 没有任何关系!它将是一个具有以下 Java 启发实现的单例:

export default (() => {

  class Person {
    // Private constructor
    constructor(firstName, lastName) {
      this.firstName = firstName;
      this.lastName = lastName;
    }
  }

  return {
    // Public static factory method
    getInstance(firstName, lastName) {
      if (!Person.instance) {
        Person.instance = new Person(firstName, lastName);
      }
      return Person.instance;
    }
  };

})();

客户端代码:

import Person from './Person';

let me = Person.getInstance('Baptiste', 'Vannesson'),
    you = Person.getInstance('David', 'Choi');

console.log(Object.is(me, you)); // true, so there is only one instance
console.log(me.firstName, me.lastName); // Baptiste Vannesson
console.log(you.firstName, you.lastName); // Baptiste Vannesson (still me!)

为了简单起见,您可能更喜欢直接导出实例:

class Person {
  constructor(firstName, lastName) {
    this.firstName = firstName;
    this.lastName = lastName;
  }
};

export default new Person('David', 'Choi');

客户端代码:

import person from './person';

// Person is not a constructor but a simple instance
let me = person,
    you = person;

console.log(Object.is(me, you)); // true
console.log(me.firstName, me.lastName); // David Choi
console.log(you.firstName, you.lastName); // David Choi

如果这样做,使用对象文字会更简单:

export default {
  firstName: 'David',
  lastName: 'Choi'
};

此处客户端代码不变。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何将构造函数参数传递给 ECMAScript 6 中的导入类? 的相关文章

  • 使用 es2017 的 async wait 重构 Promise 和 Promise.all

    我有一个照片上传处理程序的工作版本 但我想看看它如何与异步等待一起工作 在下面的内容之前是我使用 Promise 的工作代码 onChangePhotos e gt e preventDefault let files e target f
  • Object.assign 未按预期工作

    我有一个名为 bookings 的对象 其中有几个属性 我想使用 Object assign 进行扩展 如下所示 let data Object assign booking hiw event hiw booking locale tip
  • 如何异步等待直到我从数据库收到数据?

    我正在尝试创建可以通过屏幕访问的商店 文件结构 索引 ios js app index js app store database js app store userStore js 索引 ios js import AppRegistry
  • 未捕获的语法错误:意外的令牌导出

    我用过创建反应应用程序对于我的项目 我收到一个错误 未捕获的语法错误 意外的令牌导出 错误就在这段代码中 export const ENGLISH lang en messages nav translatedMessage Social
  • SAP Web IDE 显示有关 ES6+ 功能的错误

    for var items in selectedContexts var downloadModel parsed parsed items toString split 1 parsed items toString split 2 v
  • 是否可以使用 ES6 模块导入 .css 文件?

    我正在尝试使用 ES6 模块导入 css 文件 但出现错误 是否可以在不使用捆绑器或转译器 如 webpack 的情况下导入 css 文件 无法加载模块脚本 服务器响应 text css 的非 JavaScript MIME 类型 div
  • 使用 for..of 迭代时删除 Set 中的元素是否安全?

    是否指定可以删除实例中的任意元素Set迭代时使用for of然后 你不会在一个元素上迭代多次 除了删除的元素之外 您不会错过迭代开始时集合中的任何其他元素 Yes 在迭代集合时添加元素和删除元素是完全可以的 JavaScript 2015
  • React 无法读取未定义的属性映射

    我对反应很陌生 我正在尝试从 Rails api 引入数据 但我收到了错误TypeError Cannot read property map of undefined 如果我使用反应开发工具 我可以看到状态 如果我在控制台中使用它 我可以
  • ECMAScript 规范是否允许 Array 成为“超类”?

    我正在寻找任何迹象表明 超类化 内置类型是否有效根据规格 也就是说 给定任何假设的 ECMAScript 一致实现 超类化 内置函数是否会通过影响类构造函数的创建算法来破坏运行时 超一流 我创造的一个术语 指的是一个类 其通过构造它或将其作
  • 为什么使用 React hooks 过滤状态数组不起作用,但过滤原始数组却起作用

    根据用户的输入 我正在过滤一个数组 如果我使用的话它不起作用teams来自状态 但如果我使用原始数组 它会正确过滤 谁能解释为什么会发生这种情况 我有点难住了 有一个代码沙箱 https codesandbox io s immutable
  • 迭代集合元素

    我已经打开了实验性 ECMAscript 6 功能的 Chrome 标志 其中之一是Set 据我了解 详细信息Set得到了规范作者的广泛同意 我创建一个集合a并添加字符串 Hello a Set a add Hello 但我如何迭代的元素a
  • 查找数组中值最接近的对象

    我需要通过最接近的值获取数组中的对象 让我通过一个例子来解释一下 const data age 52 age 53 age 54 age 60 some data age 66 something else age 72 age 78 ag
  • 使用 Jest 模拟 Es6 类

    我正在尝试使用接收参数的构造函数来模拟 ES6 类 然后使用 Jest 模拟该类上的不同类函数以继续测试 问题是我找不到任何有关如何解决此问题的文档 我已经看过了这个帖子 https stackoverflow com questions
  • TypeScript / JavaScript - 导入所有类型

    如何从某个文件导入所有类型 假设我有myClass ts and otherClass ts 我想从中导入所有课程otherClass ts 我见过很少的导入语法 import ClassA ClassB ClassC from other
  • 函数默认参数有些问题?

    看到这个 let foo outer function bar func x gt foo let foo inner console log func bar outer 我想知道为什么输出是 外部 而不是 内部 我知道 JavaScri
  • ES6 - 有没有一种优雅的方法来导入所有命名导出而不是默认导出?

    我正在寻找一种优雅的方法来导入所有命名导出 而不必导入默认导出 在一个文件中 我导出许多命名常量以及默认值 myModule js const myDefault my default export const named1 named1
  • 如何在 Node CLI 程序中使用 babel?

    我正在 Node 中编写一个小型 CLI 工具 并希望使用 ES6 来实现 index js 看起来像 usr bin env node require babel register module exports require app 我
  • 纯函数可以异步吗?

    在浏览纯函数的定义时 它通常定义有两个特征 1 给定相同的输入应该产生相同的输出 2 不应产生任何副作用 这是否也意味着纯函数不应该是异步的 如果不是 怎么会这样 如果是的话 我很想看到 JavaScript 中异步纯函数的一些示例 是的
  • 轮询时承诺异步等待

    我正在尝试将使用承诺 和轮询 的函数转换为异步函数 但我不太确定它是如何工作的 我有这个 function myFunction return new Promise resolve gt stuff here var poll setIn
  • 如何在前端和后端之间共享javascript代码(ES6)

    这是 ES6 特定的副本这个所以线程 https stackoverflow com questions 3225251 how can i share code between node js and the browser 其中详细介绍

随机推荐