【问题标题】:Cannot define variables outside of a class's constructor function [duplicate]无法在类的构造函数之外定义变量[重复]
【发布时间】:2018-10-22 08:48:20
【问题描述】:

我正在创建一个普通的 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 修改的。此代码无意,仅用于变量声明示例目的。

【问题讨论】:

  • 你想做什么?没有诸如“class encapsulation”之类的东西,您可以在其中放置任意语句。它不是一个块,它是一个class 主体,并且只能包含方法定义。
  • 输入TypeScript引起的混乱(让JS看起来像Java)。
  • 您尝试做的事情在 Javascript 中还没有真正存在,但它看起来正在路上 -> github.com/tc39/proposal-class-fields

标签: javascript class ecmascript-6


【解决方案1】:

不能在类的构造函数之外定义变量

是的,这在语法上无效。

我将一个变量放在class 封装内,同时将它放在constructor() 之外。

这是不可能的。 class 不提供任何此类封装,它不创建块作用域。只需将变量放在class 定义之外。或者不要让它成为一个变量而是一个属性。

【讨论】:

    【解决方案2】:

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

    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 插件。

    【讨论】:

    • 不知道你为什么在这里投票失败,但可能是因为它仍然在stage 3。也许提到它还不是标准的 Javascript 可能会有所帮助..
    • 谢谢...但我目前无法访问 Babel
    • 这是一个可能的答案,所以赞成
    【解决方案3】:
    // 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);
    

    【讨论】:

      【解决方案4】:

      我认为,在一个类中你不能直接声明一个成员,你需要使用getter和setter。否则你会得到一个错误:“Unexpected token. A constructor, method, accessor, or property is expected.”

      这里是你如何得到你的坏男孩:

      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?" 做同样的事情没有任何麻烦。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-11-10
        • 2012-01-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-10-18
        相关资源
        最近更新 更多