Home > Mobile >  Checking instanceof with a class
Checking instanceof with a class

Time:04-09

I have the following code:

function Complex(real, imaginary) {
    let c = Object.create(Complex.methods);
    [c.real, c.imaginary] = [real, imaginary];
    return c;
}

Complex.methods = {
    toString() {return `${this.real} ${this.imaginary}i`},
    add(other) {
        if (!(other instanceof Complex)) throw new Error("Only supports complex-only addition");
        return Complex(this.real other.real, this.imaginary other.imaginary);
    }
}
let c1 = Complex(2,0);
let c2 = Complex(3,4);
console.log(c1.add(c2)   "");
// "Uncaught Error: Only supports complex-only addition",

This is occurring because c1 instanceof Complex is returning false. Why does it return false?

Comparing it with using the class keyword:

class CX {
    toString() {return "xxx"}
}
let c1 = new CX();
console.log(c1   "", c1 instanceof CX);
// xxx true

But still curious why the first one doesn't recognize the instanceof operator.

CodePudding user response:

The OP either chooses the classic (good ol' days) constructor function approach ...

function Complex(real, imaginary) {
  Object.assign(this, { real, imaginary });
}
Complex.prototype.toString = function toString () {
  return `${this.real}   ${this.imaginary}i`
};
Complex.prototype.add = function add (other) {
  if (!(other instanceof Complex)) {
    throw new Error("Only supports complex-only addition");
  }
  return new Complex(
    this.real   other.real,
    this.imaginary   other.imaginary
  );
};
let c1 = new Complex(2,0);
let c2 = new Complex(3,4);

console.log(c1.add(c2)   "");
.as-console-wrapper { min-height: 100%!important; top: 0; }

... or a class based approach ...

class Complex {
  constructor(real, imaginary) {
    Object.assign(this, { real, imaginary });
  }
  toString () {
    return `${this.real}   ${this.imaginary}i`
  }
  add (other) {
    if (!(other instanceof Complex)) {
      throw new Error("Only supports complex-only addition");
    }
    return new Complex(
      this.real   other.real,
      this.imaginary   other.imaginary
    );
  }
}
let c1 = new Complex(2,0);
let c2 = new Complex(3,4);

console.log(c1.add(c2)   "");
.as-console-wrapper { min-height: 100%!important; top: 0; }

  • Related