【问题标题】:Add variable method to ES6 class [duplicate]向ES6类添加变量方法[重复]
【发布时间】:2017-12-27 00:23:30
【问题描述】:

使用 ES6 类,您可以如下声明方法:

class Foo {

  bar() {}

}

但是,我需要从外部文件导入方法并将它们加载到类中。像这样的:

const barMethod = require('./bar');

class Foo {

  bar: barMethod

}

但是,这不起作用。我已经查看了一段时间的语法,并没有真正提到它。这样做的正确方法是什么?


有没有办法扩展类?因为这个类太大了,为了组织的目的,我把它分成几个文件,但是每个方法都需要能够用this引用这个类。

也许是混合?

【问题讨论】:

  • 除此之外,我相信您可能需要以另一种方式拆分课程,例如一些封装功能的小类。应该可以只写Foo.prototype.bar = require('./bar'),但我现在无法测试。

标签: class syntax ecmascript-6


【解决方案1】:

您可以将.call() barMethodFoo 实例bar 属性,可选地将this 设置为thisFoo 实例

class Foo {
  bar() {
   barMethod.call(this)
  }
}

【讨论】:

  • 这是一个想法。不幸的是,我必须导入 50 个函数。有什么可以扩展课程的吗?已编辑的问题。
  • @dthree 你需要编写某种形式的代码。有几种方法可以使用。您可以简单地创建一个 JavaScript 函数并返回一个将 Foo 设置为 this 的对象,或者使用对象数组在 Foo 实例 let foo = Object.assign(new Foo(), ...[{bar:function(){console.log(123, this)}}, {fn:function(){console.log("abc", this)}},]); foo.bar() 上设置属性
【解决方案2】:

ES6 中的class 仍然使用.prototype,因此您可以在声明后扩展类定义,方法是向`.prototype 添加方法。

原始声明:

class Foo {
  bar() {}
}

添加一些新方法:

Foo.prototype.newBar = someNewMethod;

或者,以更模块化的方式,也许您只想将 Foo 传递给其模块构造函数中的每个模块,它可以将其方法添加到 Foo.prototype

或者,每个模块可以使用自己的一组方法定义自己的类(所有设计最终都是Foo 方法,然后您可以使用一个主函数导入所有子定义并从每个导入到您的主 Foo 类原型的类最终都会得到一个大师类。

请记住,方法只是原型对象上的函数,即使该类是使用 ES6 class 语法声明的。可以使用仅对对象属性进行操作的常规 Javascript 将它们分配给其他对象。

【讨论】:

  • 我其实不知道这个!我认为这是一个全新的实现而不是原型!
  • @dthree - ES6 class 关键字只是将东西放在原型上的好语法。底层实现还是一样的。
  • @dthree - 这回答了你的问题吗?
  • 是的,谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-10-05
  • 2017-12-27
  • 2021-07-19
  • 2016-06-22
  • 2019-07-19
  • 2018-02-09
  • 2013-05-05
相关资源
最近更新 更多