Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何将mixin添加到ES6 javascript类?_Javascript_Node.js_Class_Ecmascript 6_Lodash - Fatal编程技术网

如何将mixin添加到ES6 javascript类?

如何将mixin添加到ES6 javascript类?,javascript,node.js,class,ecmascript-6,lodash,Javascript,Node.js,Class,Ecmascript 6,Lodash,在具有一些实例变量和方法的ES6类中,如何向其添加mixin?下面我给出了一个示例,但我不知道mixin对象的语法是否正确 class Test { constructor() { this.var1 = 'var1' } method1() { console.log(this.var1) } test() { this.method2() } } var mixin = { var2: 'var2', method2: { c

在具有一些实例变量和方法的ES6类中,如何向其添加mixin?下面我给出了一个示例,但我不知道mixin对象的语法是否正确

class Test {
  constructor() {
    this.var1 = 'var1'
  }
  method1() {
    console.log(this.var1)
  }
  test() {
    this.method2()
  }
}

var mixin = {
  var2: 'var2',
  method2: {
    console.log(this.var2)
  }
}
如果我运行
(new Test()).Test()
,它将失败,因为类上没有
method2
,因为它在mixin中,这就是为什么我需要将mixin变量和方法添加到类中


我看到有一个lodash mixin函数,但我不知道如何在ES6类中使用它。我可以使用lodash作为解决方案,甚至可以使用没有库的纯JS来提供mixin功能。

您可能应该看看
Object.assign()
。必须看起来像这样:

Object.assign(Test.prototype, mixin);

这将确保将
mixin
中的所有方法和属性复制到
Test
构造函数的原型对象中。

Javascript的对象/属性系统比大多数语言更具动态性,因此很容易向对象添加功能。由于函数是一级对象,因此可以用完全相同的方式将它们添加到对象中。是将一个对象的属性添加到另一个对象的方法。(它的行为在许多方面可与
相媲美.mixin

Javascript中的类是唯一的语法糖,可以使添加构造函数/原型对变得简单明了。该功能与ES6之前的代码没有改变

可以将属性添加到原型中:

Object.assign(Test.prototype, mixin);
您可以在构造函数中将其添加到创建的每个对象中:

constructor() {
    this.var1 = 'var1';
    Object.assign(this, mixin);
}
您可以根据以下条件将其添加到构造函数中:

constructor() {
    this.var1 = 'var1';
    if (someCondition) {
        Object.assign(this, mixin);
    }
}
也可以在创建对象后将其指定给对象:

let test = new Test();
Object.assign(test, mixin);

在es6中,您可以在不赋值的情况下执行此操作,甚至可以在正确的时间调用mixin构造函数

此模式使用
类表达式
为每个mixin创建一个新的基类

let MyMixin = (superclass) => class extends superclass {
  foo() {
    console.log('foo from MyMixin');
  }
};

有没有一种方法可以从
类本身中调用它呢?这是非常值得怀疑的。这是因为ES6类只是隐藏好的ol原型继承的语法糖。因此,它们基本上是预绑定的构造函数。related@lonesomeday将其添加到对象本身的原型中有什么区别?我认为在声明方法时,最好在原型上这样做,因为这样所有对象都共享相同的函数,而不是所有对象都有自己的函数来做相同的事情。这是否也适用于这种mixin技术,将其应用于原型比应用于对象更有效?@user779159该函数只存在一次。只有在再次声明函数时,才会创建第二个函数。(例如,如果您有一个decorator函数,它每次运行时都会创建一个新函数。)@lonesomeday出于兴趣,如果mixin是在对象的不同文件中声明的,那会是什么样子。正如mixin文件上的导出和对象文件(或声明对象的位置)上的require一样,如果这说明了如何在混合对象本身是ES6类(例如,目标和源都是ES6类)的情况下进行混合,那就很好了。在我看来,
Object.assign()
不适用于此,可能是因为ES6方法在默认情况下是不可编辑的。不幸的是,那篇文章提供了错误的信息。他说MixIn为“instanceOf()”提供了肯定的条件;这是不正确的。同样的误解隐藏在他的整个技巧之下;他正在延长继承链。mixin从水平方向加入一个类,但是他在垂直方向扩展继承链。我认为扩展继承链是更好的方法。instanceof只是一个附带的好处,需要一些奇特的步法。使用这种方法,您可以以受控的方式运行构造函数逻辑,这是主要的好处。在大多数语言中(那些不知道如何解决问题的语言),只能从一个超类继承。但在每一种语言中,你都可以随心所欲地混入不同的课程。
class MyClass extends MyMixin(MyBaseClass) {
  /* ... */
}