无法在类的构造函数之外定义变量

时间:2018-05-11 21:50:22

标签: javascript class ecmascript-6

我正在创建一个普通的ES6类。遇到的问题是将变量置于class封装内,同时将其保持在constructor().之外

使用此代码时,您可以复制此错误:

class Polygon {  
     constructor() {
          this.name = "Polygon";

          var goodboy = "I like pie...I can stay since I'm legal!";
     }

     var badboy = "what're you gonna do when they come for you? delete me to get rid of all your problems!";

}

var poly1 = new Polygon();

console.log(poly1.name);

您可以在任何地方试用此代码!尝试删除badboygoodboy,看看它是如何播放的。

我该如何解决这个问题?

欢迎任何解释, 法鲁克

上述代码是从MDN修改的。此代码无意,仅用于变量声明示例目的。

4 个答案:

答案 0 :(得分:0)

  

无法在类的构造函数之外定义变量

是的,这在语法上并不合适。

  

我将一个变量放在class封装中,同时将其保持在constructor()之外。

那是不可能的。 class不提供任何此类封装,它不会创建块范围。只需将变量置于class定义之外。或者不要把它变成变量而是变成属性。

答案 1 :(得分:0)

// adjusted
   class Polygon
   {
      constructor()
      {
         this.name = "Polygon";

        var goodboy = "I like pie...I can stay since I'm legal!";
      }
   }

   var poly = new Polygon();

   console.log(poly.name);

   // option 2 
   // This works also

   function Polygon2()
   {
      this.name = "Polygon";

      class Poly
      {
        constructor(obj)
        {
            this.user = "Farouk";
            this.name2 = obj.name;
        }
      }

      let poly2 = new Poly(this);

      this.user = poly2.user;
      this.name2 = poly2.name2;
   }

   var poly2 = new Polygon2();

   console.log(poly2.name);
   console.log(poly2.user);
   console.log(poly2.name2);

答案 2 :(得分:0)

我认为,在一个类中你不能直接声明一个成员,你需要使用getter和setter。否则您将收到错误:"意外的令牌。期望构造函数,方法,访问器或属性。"

以下是你如何得到你的坏人:

class Polygon {

  constructor() {
    this.name = "Polygon";
  }

  get badboy(){
    return  "what're you gonna do when they come for you?";
  }
}

var poly1 = new Polygon();
console.log(poly1.name); // Polygon
console.log(poly1.badboy); // what're you gonna do when they come for you?

您的代码意图不够明确。如果您不将它用作实例属性,为什么要将它放在类中?

你知道poly1.badboy = "what're you gonna do when they come for you?"在没有麻烦的情况下做同样的事情。

答案 3 :(得分:-1)

你可以像这样声明类级变量

class Polygon {
    myVar = null;
    constructor(args){
       this.myVar = args.myVar;
    }
}
let polygon = new Polygon({myVar:"some value"});
console.log(polygon.myVar); // "some value"

要通过使用Babel进行转换来实现此目的,您需要使用transform-class-properties插件。