JAVASCRIPT CLASS 实例默认方法



我最近去面试,在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--);
}
}

使用 new 运算符时,类构造函数或函数可以返回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. 单身 人士

class Singleton {
constructor() {
if(Singleton.instance) {
return Singleton.instance;
}

Singleton.instance = this;

return this;
}
}
console.log(new Singleton() === new Singleton()); // true

  1. 使用带有类的揭示模块模式封装模块

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

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

function A() {
var i = 1;

return function () {
console.log(i++);
}
}
var a = new A();
a();
a();
var b = new A();
b();
b();

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

没有"默认"方法这样的东西,这不是 OOP 的工作方式。new创建一个类的实例,为了接收函数作为实例,类应该是Function的子类,所以这个答案在技术上是正确的,尽管不切实际。

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

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

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 +答案的陷阱。

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

最新更新