我正在尝试学习JavaScript ES6,这是一种非常酷的语言,我认为我应该练习一下,但我无法制作an exercise。 那么如何使用object literal复制一个类。
例如,课程是:
class Point {
constructor(x, y) {
this.x = x, this.y = y
}
add(other) {
return new Point(this.x + other.x, this.y + other.y)
}
}
我想在这里使用object literal做一些事情来使输出成为真。
var fakePoint = YOUR_CODE_HERE
console.log(fakePoint instanceof Point)
答案 0 :(得分:5)
我猜这个练习正在寻找一个使用__proto__
as an object literal key的解决方案 - mentioned in the slides:
var fakePoint = {
__proto__: Point.prototype,
x: Math.random(),
y: Math.random()
};
console.log(fakePoint instanceof Point)
但是,__proto__
is deprecated(在对象文字和Object.prototype
getter / setter中)并且仅在Web浏览器中作为ES6标准化的遗留功能提供,因此我建议避免使用此类代码。正确的解决方案是使用Object.create
:
var fakePoint = Object.assign(Object.create(Point.prototype), {
x: Math.random(),
y: Math.random()
});
console.log(fakePoint instanceof Point)
答案 1 :(得分:0)
只是为了好玩,这是另一种方法,可能不是练习作者想要的,但可以说是对象文字:
var fakePoint = {
x: Math.random(),
y: Math.random(),
fakeConstructor: Object.defineProperty(Point, Symbol.hasInstance, {
value(o) { return o.fakeConstructor == this; }
})
};
console.log(fakePoint instanceof Point)
它的工作原理是给Point
一个custom hasInstance
implementation,它不会检查原型链,而是检查fakeConstructor
属性。也可以使用"x" in o && "y" in o
或类似的东西。当然,将这种副作用作为对象字面的一部分是非常可怕的,最好是写出来
Object.defineProperty(Point, Symbol.hasInstance, {
value(o) { return o.fakeConstructor == this; /* this === Point */ }
});
var fakePoint = {
x: Math.random(),
y: Math.random(),
fakeConstructor: Point
};