以下の内容はhttps://var.blog.jp/archives/81507050.htmlより取得しました。
COMMENT
コメント一覧 (5)
1. petamoriken
2020/03/07 18:50
クラスの prototype の __proto__ を変更できないのであれば this の __proto__ を変更したらどうだろうと思ってこのようなコードを書いてみました。いかがでしょうか。
https://gist.github.com/petamoriken/bb99ca136bc663d3c6ac
0
が
しました
3.
[管理人]
2020/03/09 22:04
>>1
引き続きコメントありがとうございます
> クラスの prototype の __proto__ を変更できないのであれば this の __proto__ を変更したらどうだろうと思って
本文中の class C みたいな中身が空っぽならこれでいいかなとも思ったのですが 最終的にやりたかったのが 本文の下の方にある class EE のように on や off などのメソッドを追加したものだったのでその方法は取りませんでした
on などのメソッドも this のプロパティとして代入してしまえば出来はするのですけどね
Gist 拝見しました
Symbol.hasInstance を設定していますが これが必要な理由ってなんでしょうか?
もとが EventTarget を継承した DocumentFragment を継承して new しますし インスタンスの __proto__ も EventTarget.prototype に設定しているのでなくても同じのように思うのですけど……ないとうまく行かないケースありますか?
instanceof はこれ⇩でも true になります
class Foo {}
x = { __proto__: Foo.prototype }
console.log(x instanceof Foo)
// true
0
が
しました
4. ななしさん
2020/03/10 00:12
>>3
自分のコード例ですと MyEventTarget.prototype は DocumentFragment.prototype を継承するものの、new MyEventTarget() をした際には this が EventTarget.prototype は継承するものの DocumentFragment.prototype を継承しないように変更されるため instanceof でちゃんと判定できなくなっています。そのため @@hasInstance を使っていました。
class MyEventTarget extends DocumentFragment { constructor() { super(); Object.setPrototypeOf(this, EventTarget.prototype); } }
// false
console.log(new MyEventTarget instanceof MyEventTarget);
> ここまで来ると class 構文使う必要があるのかってくらいです
function を使ったほうがよさそうかなと思って作り直してみました。。。
https://gist.github.com/petamoriken/d3745051d6f7684af58985d18efa2786
0
が
しました
5.
[管理人]
2020/03/10 00:35
>>4
あっ すみません勘違いしてました
console.log(new MyEventTarget instanceof MyEventTarget)
じゃなくて
console.log(new MyEventTarget instanceof EventTarget)
で考えてました……
0
が
しました
2. petamoriken
2020/03/07 21:46
いや、無理に継承を使わない方が変な影響が出なくて良さそうですね。失礼しました。
0
が
しました