'Checking instanceof with a class
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.
Solution 1:[1]
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; }
Sources
This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.
Source: Stack Overflow
| Solution | Source |
|---|---|
| Solution 1 |
