目前在ES5中,我们很多人在框架中使用以下模式来创建类和类变量,这很舒服:

// ES 5
FrameWork.Class({

    variable: 'string',
    variable2: true,

    init: function(){

    },

    addItem: function(){

    }

});

在ES6中,你可以在本地创建类,但是没有选项可以有类变量:

// ES6
class MyClass {
    const MY_CONST = 'string'; // <-- this is not possible in ES6
    constructor(){
        this.MY_CONST;
    }
}

遗憾的是,上述方法不起作用,因为类只能包含方法。

我知道我能做到。myVar = true在构造函数…但我不想'垃圾'我的构造函数,特别是当我有20-30+参数为一个更大的类。

我想了很多方法来处理这个问题,但还没有找到一个好的。(例如:创建一个ClassConfig处理程序,并传递一个参数对象,该对象与类分开声明。然后处理程序将附加到类。我也在考虑以某种方式集成WeakMaps。)

你会有什么样的想法来处理这种情况?


当前回答

你仍然不能像在其他编程语言中那样声明任何类。但是您可以创建尽可能多的类变量。但问题是类对象的范围。所以根据我,最好的方法OOP编程在ES6 Javascript:-

class foo{
   constructor(){
     //decalre your all variables
     this.MY_CONST = 3.14;
     this.x = 5;
     this.y = 7;
     // or call another method to declare more variables outside from constructor.
     // now create method level object reference and public level property
     this.MySelf = this;
     // you can also use var modifier rather than property but that is not working good
     let self = this.MySelf;
     //code ......... 
   }
   set MySelf(v){
      this.mySelf = v;
   }
   get MySelf(v){
      return this.mySelf;
   }
   myMethod(cd){
      // now use as object reference it in any method of class
      let self = this.MySelf;
      // now use self as object reference in code
   }
}

其他回答

ES7类成员语法:

ES7有一个“废弃”构造函数的解决方案。这里有一个例子:

车{ 轮子= 4; 重量= 100; } const car = new car (); console.log(车。轮子,car.weight);

上面的例子在ES6中看起来如下所示:

车{ 构造函数(){ 这一点。轮子= 4; 这一点。重量= 100; } } const car = new car (); console.log(车。轮子,car.weight);

使用此语法时请注意,此语法可能不是所有浏览器都支持,可能必须转译为早期版本的JS。

好处:一个对象工厂:

函数generateCar(车轮,重量){ 车{ 构造函数(){} 轮子=轮子; 重量=重量; } 返回新车(); } const car1 = generateCar(4,50); const car2 = generateCar(6,100); console.log (car1。轮子,car1.weight); console.log (car2。轮子,car2.weight);

2018年更新:

现在有一个第三阶段的提案——我期待着在几个月内让这个答案过时。

与此同时,任何使用TypeScript或babel的人都可以使用以下语法:

varName = value

在类声明/表达式体中,它将定义一个变量。希望在几个月或几周后,我能够发布更新。

更新:Chrome 74现在船与此语法工作。


ES wiki中关于ES6提案的注释(最大最小类)注意到:

(有意地)没有直接的声明性方法来定义原型数据属性(方法除外)类属性或实例属性 类属性和原型数据属性需要在声明之外创建。 在类定义中指定的属性被赋予与出现在对象字面量中相同的属性。

这意味着你的要求已经被考虑过了,并且被明确地否决了。

但是…为什么?

好问题。TC39的好人希望类声明能够声明和定义类的功能。不是它的成员。ES6类声明为用户定义了它的契约。

记住,类定义定义了原型方法——在原型上定义变量通常不是你要做的事情。 当然,你可以使用:

constructor(){
    this.foo = bar
}

在构造函数中。另见共识摘要。

ES7及以上版本

ES7的一个新提议正在研究中,它允许通过类声明和表达式来实现更简洁的实例变量——https://esdiscuss.org/topic/es7-property-initializers

你仍然不能像在其他编程语言中那样声明任何类。但是您可以创建尽可能多的类变量。但问题是类对象的范围。所以根据我,最好的方法OOP编程在ES6 Javascript:-

class foo{
   constructor(){
     //decalre your all variables
     this.MY_CONST = 3.14;
     this.x = 5;
     this.y = 7;
     // or call another method to declare more variables outside from constructor.
     // now create method level object reference and public level property
     this.MySelf = this;
     // you can also use var modifier rather than property but that is not working good
     let self = this.MySelf;
     //code ......... 
   }
   set MySelf(v){
      this.mySelf = v;
   }
   get MySelf(v){
      return this.mySelf;
   }
   myMethod(cd){
      // now use as object reference it in any method of class
      let self = this.MySelf;
      // now use self as object reference in code
   }
}

如果只是构造函数的混乱问题,为什么不实现一个初始化方法来初始化变量呢?当构造函数充满了不必要的东西时,这样做是很正常的。即使在类型化的程序语言中,如c#,它的常规约定是添加一个Initialize方法来处理它。

Babel支持ESNext中的类变量,检查这个例子:

class Foo {
  bar = 2
  static iha = 'string'
}

const foo = new Foo();
console.log(foo.bar, foo.iha, Foo.bar, Foo.iha);
// 2, undefined, undefined, 'string'