JAVASCRIPT CLASS实例默认方法

时间:2018-03-22 14:57:06

标签: javascript ecmascript-6

我最近去接受采访并得到了一个我无法回答的JAVASCRIPT问题,但我真的很想知道答案,但我不知道如何在谷歌中说出来。

问题是:

var a = new A();
a(); // return 1
a(); // return 2

var b = new A();
b(); //return 1;
b(); //return 2;

实施A

如何使用javascript解决此问题。到目前为止我得到了这个

class A {
  constructor(){
    this.num = 1;
  }
  function(){
    console.log(this.num--);
  }
}

4 个答案:

答案 0 :(得分:4)

使用new operator时,类构造函数或函数可以返回this以外的值。根据MDN:

  

构造函数返回的对象成为结果   全新的表达。如果构造函数不起作用   显式返回一个对象,使用在步骤1中创建的对象   代替。 (通常情况下,施工人员不会返回值,但他们可以   如果他们想要覆盖正常的对象创建,请选择这样做   过程。)

因此,这个问题的一个可能答案是从构造函数返回一个函数:



class A {
  constructor(){
    this.num = 1;
    
    return this.func.bind(this); // bind the function to `this`
  }
  
  func() {
    console.log(this.num++);
  }
}

var a = new A();
a(); // return 1
a(); // return 2

var b = new A();
b(); //return 1;
b(); //return 2;




可能的用途:

在回答这个问题之后,我开始考虑返回值的合法用途。

  1. 的Singleton
  2. 
    
    class Singleton {
      constructor() {
        if(Singleton.instance) {
          return Singleton.instance;
        }
        
        Singleton.instance = this;
        
        return this;
      }
    }
    
    console.log(new Singleton() === new Singleton()); // true
    
    
    

    1. 使用带有类
    2. Revealing Module Pattern封装模块

      
      
      class Module {
        constructor(value) {
          this.value = value;
          
          return {
            increment: this.increment.bind(this),
            decrement: this.decrement.bind(this),
            getValue: this.getValue.bind(this),
          };
        }
        
        increment() {
          this.value++;
        }
        
        decrement() {
          this.value--;
        }
        
        getValue() {
          return this.value;
        }
      }
      
      const module = new Module(5);
      
      module.increment();
      module.increment();
      module.decrement();
      
      console.log(module.value); // undefined
      console.log(module.getValue()); // 6
      
      
      

答案 1 :(得分:4)

目前还不清楚是否需要使用class;这是一个使用简单闭包的解决方案,基本上忽略了new关键字:



function A() {
    var i = 1;
    
    return function () {
        console.log(i++);
    }
}

var a = new A();
a();
a();

var b = new A();
b();
b();




答案 2 :(得分:1)

这是XY问题。在面试问题中没有要求使用ES6课程。它在这里被滥用是因为它无法提供任何合理的类设计(从OOP的角度来看没有任何意义,并且从JS的角度来看需要不合理的原型黑客攻击)。

没有“默认”方法,这不是OOP的工作方式。 new创建一个类的实例,并且为了接收函数作为实例,类应该是Function的子项,因此this answer在技术上是正确的,尽管不切实际。 / p>

答案并没有真正解释,但这个面试问题的正确答案是:

应该从构造函数返回新函数。

function A(num = 0) {
  return () => ++num;
}

var a = new A();
a(); // return 1
a(); // return 2

这是可行的,但没有理由将此函数用作构造函数。预期类实例用于存储公开num状态,并且没有好的方法在此容量中使用this作为类实例,因为构造函数和构造函数之间的原型继承返回功能未建立。 new没有任何目的提供额外的开销。该解决方案纯粹是功能性的,使用new是错误的,所以应该省略它。

var a = A();
a(); // return 1
a(); // return 2

提问的人很可能会对答案感到沮丧;这不是A +答案的抓地力。

答案 3 :(得分:-1)

class A {
  constructor () {
    this.num = 1
    return () => {
      console.log(this.num++)
    }
  }
}