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; }