関数が実体渡しに見えたけれども、本当はどうなんだろうと思って。
Object.prototype.toString.call(class Some {}) しても、返ってくるのは [object Function] だからなーと思いつつ。
結果を見ると、「コピーしているように見えて、そういうわけでもない。」という感じに見えて、なんだか複雑に見えるけど、そういうわけでもない。
「class Origin」も「Copy」も、「{ constructor(_str){} ....}」 という名前の決まっていない object への参照なのである。
ファイルシステムで例えるなら、同じファイルへのショートカット名が Origin か Copy かという違いなので、Copy.prototype.sing を書き換えると、同じファイルを参照している Origin.prototype.sing に影響が出るのは当然である、ということだ。Origin を undefined にするということは、つまり、今までショートカットファイルだった Origin を、正体不明のファイル Origin に書き換えている、ということなのであると思う感じみたいな。
まぁ、詰まる所(詰まる所さん?! マズイですよ…)、function として使う分にはコピー感覚で良いけど、そうでもない(class として扱う)ならちゃんと class extends しなさいよ。ということだと思う。