JAVASCRIPT类实例默认方法
我最近参加了一次采访,得到了一个关于JAVASCRIPT的问题,我无法回答,但我真的很想知道答案,但我不知道如何在google中表达它 问题是: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
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
的子类,因此在技术上是正确的,尽管不实用
答案并不能真正解释这一点,但这个面试问题的正确答案是:
新函数应该从构造函数返回
它是可行的,但没有理由将此函数用作构造函数。预计类实例将用于存储和exposenum
状态,并且没有好的方法将此
用作此容量的类实例,因为构造函数和返回函数之间未建立原型继承<代码>新建
提供了额外的开销,没有任何目的。该解决方案纯粹是功能性的,使用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