小编Cap*_*ara的帖子

在实例化从Chrome V8中的Object扩展的类时,super()不传递参数

以下代码在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)

javascript google-chrome v8 ecmascript-6 babeljs

8
推荐指数
1
解决办法
1110
查看次数

如何扩展 CanvasRenderingContext2D (如果可能的话,在 ES6 风格的脚本中)

我想创建一个扩展的新类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)

javascript canvas ecmascript-6

5
推荐指数
1
解决办法
701
查看次数

标签 统计

ecmascript-6 ×2

javascript ×2

babeljs ×1

canvas ×1

google-chrome ×1

v8 ×1