我最近去接受采访并得到了一个我无法回答的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--);
}
}
答案 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;

可能的用途:
在回答这个问题之后,我开始考虑返回值的合法用途。
class Singleton {
constructor() {
if(Singleton.instance) {
return Singleton.instance;
}
Singleton.instance = this;
return this;
}
}
console.log(new Singleton() === new Singleton()); // true

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++)
}
}
}