CanvasRenderingContext2D
を拡張する新しいクラスを作成したいとします。だから私はCanvasRenderingContext2D.attribute
の代わりに、その新しいクラスのprototype
属性にユーザー定義の属性を割り当てることができます。以下は、私が書くことを意図したコードです:CanvasRenderingContext2Dを拡張する方法(可能であれば、ES6スタイルのスクリプトで)
class WL_CRC2D extends CanvasRenderingContext2D{
constructor(){
super();
}
setStyle(args){//...
}
//...
}
var ctx = new WL_CRC2D() // Uncaught TypeError: Illegal constructor
CanvasRenderingContext2D
がnew
オペレータを防ぐため、これは動作しません - 次のコードは、エラーがスローされますと同じように:
var ctx = new CanvasRenderingContext2D(); // Uncaught TypeError: Illegal constructor
それから私は書き直してみました別の方法でコンストラクタ:
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() { [native code] }
ctx.arc(0, 0, 10, 0, 1, true); // Uncaught TypeError: Illegal invocation
コメントが示すように、から作成された新規インスタンス0はこのようにして実際にWL_CRC2D.prototype
の属性にアクセスすることはできません。
CanvasRenderingContext2D
というシステム定義のクラスを汚染しないで回避する方法はありますか?お知らせ下さい。ありがとう!