以下代码在Chrome V8中记录为false,但在Babel中记录为true.来自谷歌的反馈说,记录错误就是它应该是如何记录真实是巴别塔的错误.我查看了ES6的规格,仍然无法理解这背后的机制.任何想法将不胜感激!
class NewObj extends Object{
constructor(){
super(...arguments); // In V8, after arguments === [{attr: true}]
// is passed as parameter to super(),
// this === NewObj{} in V8;
// but this === NewObj{attr: true} in Babel.
}
}
var o = new NewObj({attr: true});
console.log(o.attr === true);
Run Code Online (Sandbox Code Playgroud) 我想创建一个扩展的新类CanvasRenderingContext2D。这样我就可以将用户定义的属性分配给prototype该新类的属性,而不是分配给CanvasRenderingContext2D.attribute. 以下是我打算写的代码:
class WL_CRC2D extends CanvasRenderingContext2D{
constructor(){
super();
}
setStyle(args){//...
}
//...
}
var ctx = new WL_CRC2D() // Uncaught TypeError: Illegal constructor
Run Code Online (Sandbox Code Playgroud)
这不起作用,因为CanvasRenderingContext2D会阻止new操作符 - 正如以下代码也会引发错误:
var ctx = new CanvasRenderingContext2D(); // Uncaught TypeError: Illegal constructor
Run Code Online (Sandbox Code Playgroud)
然后我尝试用另一种方式重写构造函数:
class WL_CRC2D{
constructor(){
let ctxTemp = Object.create(CanvasRenderingContext2D.prototype);
for (let i of Reflect.ownKeys(ctxTemp.__proto__)){
Object.defineProperty(this.__proto__, i, Object.getOwnPropertyDescriptor(ctxTemp.__proto__, i));
}
}
setStyle(args){//...
}
//...
}
var ctx = new WL_CRC2D(); // fine
console.log(ctx.arc); // function arc() …Run Code Online (Sandbox Code Playgroud)