Javascript 返回ES6中类以外的值

Javascript 返回ES6中类以外的值,javascript,constructor,ecmascript-6,Javascript,Constructor,Ecmascript 6,最近,我一直在用ES6测试类,我注意到在创建类时,不能指定构造函数给出的值 以前在ES5中,这是可能的 在这两种情况下,我都会用newmyclass 我想这样做的原因是,我可以返回当前类的一个子集,其中只包含函数 ES5-returns我的类初始化时使用了:Blah ES6-返回{} 比较这些小提琴:和 你在es5中所说的可能在es6中仍然是可能的,有一点是,如果你使用new关键字,那么会为该类创建一个新对象,如果你不使用new,那么函数就会执行 所以当你说,var x=Bob()在es5和e

最近,我一直在用ES6测试类,我注意到在创建类时,不能指定构造函数给出的值

以前在ES5中,这是可能的

在这两种情况下,我都会用
newmyclass
我想这样做的原因是,我可以返回当前类的一个子集,其中只包含函数

ES5-returns
我的类初始化时使用了:Blah
ES6-返回
{}
比较这些小提琴:和

你在es5中所说的可能在es6中仍然是可能的,有一点是,如果你使用new关键字,那么会为该类创建一个新对象,如果你不使用new,那么函数就会执行

  • 所以当你说,
    var x=Bob()
    在es5和es6中,您执行构造函数,而不是创建新对象,因此它会返回一些内容

  • 当你说,
    varx=newbob(),您将获得一个由构造函数初始化的新对象


  • 这适用于es5和es6,因为es6类没有什么新功能,只是为了语法而引入的

    编辑:在扩展类的情况下: 您不能仅仅在es6中扩展一个类并期望调用超级构造函数,您需要在子类构造函数中显式调用它。。参见代码:

    class Bob {
      constructor() {
        return {hi: 'bob'}
      }
    }
    
    class Bill extends Bob {
      constructor() {
       return super();// here you should retun the called super constructer
      }
    }
    
    var x=  Bob();
    console.log(Bob);
    
     x= new Bill();
    console.log(x.hi);
    
    这就是为什么ES6类不起作用,但起作用的原因。

    根据来自TC39网站的消息,ES6类语法有一个隐式构造函数,如果类定义中没有提供此类函数,则会调用该构造函数

    可以通过提供自己的构造函数并返回所需的任何对象(例如:

    class Bob {
      constructor(name) {
        return {hi: name};  // returns an object other than *this*.
      }
    }
    
    在行动中:

    var bob = new Bob('bob');
    console.log(bob.hi); // 'bob'
    
    要扩展该类,可以执行以下操作:

    class Bill extends Bob {
    }
    
    然而,extends也有一个隐式构造函数,因此它将返回从Bob.prototype继承的Bill的一个新实例。由于hi是在构造函数中定义的,而不是继承的,因此您可以得到:

    var bill = new Bill('bill');
    console.log(bill.hi);  // undefined
    
    要初始化Bill与Bob相同,请提供一个调用super的构造函数。此调用还将Bill的This对象更改为super返回的值,例如

    现在:

    var bill = new Bill('bill');
    console.log(bill.hi); // bill
    
    还值得注意的是,类声明的主体始终是

    作为可运行的代码段:

    类Bob{
    建造师(姓名){
    return{hi:name};//返回*this*以外的对象。
    }
    }
    var bob=新bob(“bob”);
    console.log(bob.hi);/'鲍勃的
    班长:鲍勃{
    建造师(姓名){
    超级(姓名);
    }
    }
    var票据=新票据(“票据”);
    
    console.log(bill.hi);//bill
    在这种情况下,
    ES6
    实际上不返回
    {}
    ,而是返回类(构造函数)对象。类构造函数可以返回对象,但不能返回原语值。因此,它不返回[String]
    “hello”
    ,而是返回[Object]
    Bob
    。任何值都可以通过以下方式返回:

    class Bob {
      constructor() {
       return ()=>'hello';
      }
    }
    const bob = new Bob()();
    

    返回的[Function],因为它是一个对象,可以返回并立即激发它以返回一些基本值,例如[String]
    “hello”

    如果调用ES6类和构造函数函数“Class”,将会非常混乱。它们是截然不同的东西。如果用new调用MyClass函数,它将不会返回您认为它返回的内容。它返回的是这个函数引用的对象,而不是return语句中的字符串。请参阅。@RobG:Hmm,类只是构造函数的语法糖,所以它们实际上应该是相同的。@FelixKling确定,但是语法是完全不同的。我只是认为需要有一个简单的方法来区分正在使用的模式。也许是“ES6类”与“传统构造函数”?我想我现在理解了你的问题:“ES6类能否返回除此之外的对象”@即使在ES5中,如果你使用
    new
    调用构造函数,它也会返回一个基本字符串
    new
    始终返回一个对象。您是正确的,但是当使用
    new
    调用时,ES6和ES5都允许您返回对象。但是,由于某些原因,在扩展类时会丢失此行为,请参见@Snowfiring。。看见同样,如果继承es6中的类,则需要调用超级构造函数。。编辑了我的答案。。请看es6中的“这同时适用于es5和es6”将类作为函数调用会导致错误。您链接到的ES6 fiddle会因此而抛出错误。关于解决方法,我得出了相同的结论,感谢您提供的额外信息。你有没有关于为什么规格是这样的信息。如果不定义构造函数,扩展类的返回值就不同,这似乎很奇怪。@RobG,值得一提的是,
    类Bill
    不必返回,只需调用super就可以了。超级调用的返回将更改此引用。进一步的背景:JavaScript的创建者在2014年在这里讨论了构造函数返回值的问题:。该语言的原始创建者Brendan Eich(至少在当时)支持继续允许返回值,他说“我们在TC39会议上讨论了构造函数中的返回表达式,我的感觉是我们希望保留该选项。类(主要是糖)等等。”
    class Bill extends Bob {
      constructor(name) {
        super(name);
      }
    }
    
    var bill = new Bill('bill');
    console.log(bill.hi); // bill
    
    class Bob {
      constructor() {
       return ()=>'hello';
      }
    }
    const bob = new Bob()();