逆向工程基类定义



在我要解决的一个难题中,有一个任务来确定下面的类的基类

class MyClass extends BaseClass {
    result(a, b) {
        this.a = a;
        this.b = b;
        return 100 - this.a + this.b;
    }
}
let m = new MyClass();
m.result(10, 20) === 90;
m.result(20, 10) === 110;

我不需要准备求解,我需要解释如何获得可能的基类定义。

可能是:

class BaseClass {
  set a(v) { this._a = 30-v }
  get a( ) { return this._a }
  set b(v) { this._b = 30-v }
  get b( ) { return this._b }
}

或以下:

class BaseClass {
  set a(v) { this._b = v }
  get a( ) { return this._a }
  set b(v) { this._a = v }
  get b( ) { return this._b }
}

有很多无限的方法可以实现这一目标:

class BaseClass {
    constructor ( ) {
      this.i = -1;
    }
    set a(v) { this.i++; }
    get a( ) { return (2-this.i)*10 }
    set b(v) { }
    get b( ) { return (this.i+1)*10 }
}
class MyClass extends BaseClass {
    result(a, b) {
        this.a = a;
        this.b = b;
        return 100 - this.a + this.b;
    }
}
let m = new MyClass();
console.log( m.result(10, 20) === 90 );
console.log( m.result(20, 10) === 110 );

另外一个例子和预期的输出可能会大大缩小解决方案家族的范围。当我提供其他数字时,我给出的第一个和第二个示例与每个示例不同,第三个示例取决于result的次数,而不是传递给它的参数。

您需要的只是Object.getPrototypeOf,例如

Object.getPrototypeOf(MyClass) === BaseClass

ES6类语法将结果构造函数的[[Prototype]]设置为父类。

最新更新