返回ES6中除类之外的值

时间:2015-01-16 09:39:39

标签: javascript constructor ecmascript-6

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

以前在ES5中这是可能的。

在这两种情况下,我都会使用new MyClass实例化该类 我想这样做的原因是我可以返回当前类的子集,只有函数。

ES5 - 返回My class was init with: Blah

var MyClass = function() {
  this.initVar = 'Blah'

  return 'My Class was init with: ' + this.initVar
}

ES6 - 返回{}

class Bob {
  constructor() {
   return 'hello' 
  }
}

3 个答案:

答案 0 :(得分:26)

根据TC39网站的Class article,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

要像 Bob 一样初始化Bill,请提供一个调用 super 的构造函数。此调用还会将 Bill 对象更改为 super 返回的值,例如

class Bill extends Bob {
  constructor(name) {
    super(name);
  }
}

现在:

var bill = new Bill('bill');
console.log(bill.hi); // bill

另外值得注意的是, classDeclaration 的正文总是strict mode code

作为一个可运行的片段:

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 {
  constructor(name) {
    super(name);
  }
}

var bill = new Bill('bill');
console.log(bill.hi); // bill

答案 1 :(得分:0)

比较这些小提琴:es5es6

你在es6中说的可能性仍然可以在es6中,如果你使用new关键字,那么会创建一个小的东西,然后创建该类的新对象,如果你不是新的,那么执行该函数。 / p>

  1. 所以当你在es5和es6中都说var x= Bob();时,你执行构造函数,而不是创建一个新对象,因此返回一些东西。

  2. 当你说var x= new Bob();时,你得到一个新的对象,由构造函数初始化。

  3. 这适用于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);
    

    这就是为什么,this不起作用,但this有效..

答案 2 :(得分:0)

The ES6 actually does not return {} but the class (constructor) object in that case. The class constructor can return objects, but not primitive values. So instead of [String] "hello" it returns [Object] Bob. Any value can be returned this way:

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

The returned [Function], as it is an object, can be returned and immediately fired to return some primitive value, eg. [String] "hello".