I recently went for an interview and got a question on JAVASCRIPT which I could not answer, but i would really like to know the answer, but I do not know how to phrase it in google.
The question is:
var a = new A();
a(); // return 1
a(); // return 2
var b = new A();
b(); //return 1;
b(); //return 2;
Implement A
How can I solve this using javascript. I got this so far
class A {
constructor(){
this.num = 1;
}
function(){
console.log(this.num--);
}
}
I recently went for an interview and got a question on JAVASCRIPT which I could not answer, but i would really like to know the answer, but I do not know how to phrase it in google.
The question is:
var a = new A();
a(); // return 1
a(); // return 2
var b = new A();
b(); //return 1;
b(); //return 2;
Implement A
How can I solve this using javascript. I got this so far
class A {
constructor(){
this.num = 1;
}
function(){
console.log(this.num--);
}
}
Share
asked Mar 22, 2018 at 14:57
leo277leo277
4453 silver badges17 bronze badges
2
-
2
if invoking
a()
increases from 1 to 2, why are you decrementing? – Sterling Archer Commented Mar 22, 2018 at 14:59 - 2 Does it have to be a class…? – deceze ♦ Commented Mar 22, 2018 at 15:00
4 Answers
Reset to default 4When using the new operator, A class constructor or a function can return a value other than this
. According to MDN:
The object returned by the constructor function bees the result of the whole new expression. If the constructor function doesn't explicitly return an object, the object created in step 1 is used instead. (Normally constructors don't return a value, but they can choose to do so if they want to override the normal object creation process.)
So a possible answer to this question is to return a function from the constructor:
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;
Possible uses:
After answering this question, I've started to think about the legitimate uses of the return value.
- Singleton
class Singleton {
constructor() {
if(Singleton.instance) {
return Singleton.instance;
}
Singleton.instance = this;
return this;
}
}
console.log(new Singleton() === new Singleton()); // true
- Encapsulated module using the Revealing Module Pattern with a class
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
It is unclear whether using a class
is required; here's a solution using a simple closure and basically ignoring the new
keyword:
function A() {
var i = 1;
return function () {
console.log(i++);
}
}
var a = new A();
a();
a();
var b = new A();
b();
b();
This is XY problem. There is no requirement to use ES6 class in interview question. It is misused here because it cannot provide any reasonable class design (it makes no sense from OOP point of view and requires unreasonable prototype hacking from JS point of view).
There is no such thing as 'default' method, this isn't how OOP works. new
creates an instance of a class, and in order to receive a function as an instance, a class should be a child of Function
, so this answer is technically correct, although impractical.
The answers don't really explain that, but the proper answer to this interview question is:
New function should be returned from constructor function.
function A(num = 0) {
return () => ++num;
}
var a = new A();
a(); // return 1
a(); // return 2
It is workable, but there is no reason to use this function as a constructor. It's expected that class instance is used to store and expose num
state, and there is no good way to use this
as class instance in this capacity because prototypal inheritance between constructor and returned function weren't established. new
provides additional overhead without any purpose. The solution is purely functional, and the use of new
is the mistake, so it should be omitted.
var a = A();
a(); // return 1
a(); // return 2
And there is a good chance that the one who asks the question will be frustrated by the answer; it's unlikely that this was a catch for A+ answer.
class A {
constructor () {
this.num = 1
return () => {
console.log(this.num++)
}
}
}