JAVASCRIPT类实例默认方法

JAVASCRIPT类实例默认方法,javascript,ecmascript-6,Javascript,Ecmascript 6,我最近参加了一次采访,得到了一个关于JAVASCRIPT的问题,我无法回答,但我真的很想知道答案,但我不知道如何在google中表达它 问题是: var a = new A(); a(); // return 1 a(); // return 2 var b = new A(); b(); //return 1; b(); //return 2; 实施 如何使用javascript解决这个问题。到目前为止我都知道了 class A { constructor(){ this.nu

我最近参加了一次采访,得到了一个关于JAVASCRIPT的问题,我无法回答,但我真的很想知道答案,但我不知道如何在google中表达它

问题是:

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

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

如何使用javascript解决这个问题。到目前为止我都知道了

class A {
  constructor(){
    this.num = 1;
  }
  function(){
    console.log(this.num--);
  }
}
使用时,类构造函数或函数可以返回除此之外的值。根据MDN:

构造函数返回的对象成为 全新的表达方式。如果构造函数没有 显式返回一个对象,使用在步骤1中创建的对象 相反(通常构造函数不返回值,但它们可以 如果要覆盖普通对象创建,请选择这样做 过程。)

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

A类{
构造函数(){
this.num=1;
返回this.func.bind(this);//将函数绑定到'this'`
}
func(){
log(this.num++);
}
}
var a=新的a();
a();//返回1
a();//返回2
var b=新的A();
b()//返回1;

b()//返回2不清楚是否需要使用
;下面是一个使用简单闭包的解决方案,基本上忽略了
new
关键字:

函数A(){
var i=1;
返回函数(){
console.log(i++);
}
}
var a=新的a();
a();
a();
var b=新的A();
b();

b()这是XY问题。面试问题不要求使用ES6课程。它在这里被误用,因为它不能提供任何合理的类设计(从OOP的角度来看,它毫无意义,从JS的角度来看,它需要不合理的原型攻击)

没有“默认”方法,OOP不是这样工作的
new
创建类的实例,为了将函数作为实例接收,类应该是
function
的子类,因此在技术上是正确的,尽管不实用

答案并不能真正解释这一点,但这个面试问题的正确答案是:

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

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


提出问题的人很有可能会因为答案而感到沮丧;这不太可能是一个+答案。

如果调用
a()
从1增加到2,为什么要递减?它必须是一个类吗…?这可能有一个重要的优点,即保持计数器变量私有。这看起来更整洁,但是我不知道你可以在函数上使用new,因为某些原因以前的评论都被删除了。应该注意,返回
this.func.bind(this)
的基本问题是它不公开
实例(
this
)和
num
状态。考虑到它是“默认”方法,没有办法调用非默认方法。因此,整个类没有意义,只是为了满足ES6类的要求而存在(这是XY问题,因为OP错误地解释了面试问题)。类继续生活在闭包中,方法是它的接口。事实证明,它有一些用途,尽管它看起来仍然很奇怪。请看问题末尾的“可能的用途”。我称之为“only”方法,而不是“default”,但这就是原始问题的问题所在。是的,可能的用法看起来更合理(尽管在这一点上,类通常被认为是反模式的,因为它是针对普通对象和函数的作业)。
class A {
  constructor () {
    this.num = 1
    return () => {
      console.log(this.num++)
    }
  }
}
function A(num = 0) {
  return () => ++num;
}

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