<p dir="auto">This is difficult to explain, so I've written an isolated test case:</p>
<div class="highlight highlight-source-js notranslate position-relative overflow-auto" dir="auto" data-snippet-clipboard-copy-content="let instances   = new Map();

class Resource{

    static get(id){
        let list = instances.get(this) || {};
        return list[id];
    }

    static add(id, instance){
        let list = instances.get(this);
        if(!list)
            instances.set(this, list = {});
        list[id] = instance;
    }

    constructor(id){
        let type        = this.constructor;
        let byId        = type.get(id);

        // Already created. Return reference to existing instance.
        if(byId){
            return byId;
        }

        this.id = id;
        type.add(id, this);
    }
}


class SubtypeResource extends Resource{

}


let resourceA = new SubtypeResource(200);
let resourceB = new SubtypeResource(200);
console.log(resourceA === resourceB); // &quot;true&quot; if natively supported; &quot;false&quot; if transpiled"><pre class="notranslate"><span class="pl-k">let</span> <span class="pl-s1">instances</span>   <span class="pl-c1">=</span> <span class="pl-k">new</span> <span class="pl-v">Map</span><span class="pl-kos">(</span><span class="pl-kos">)</span><span class="pl-kos">;</span>

<span class="pl-k">class</span> <span class="pl-v">Resource</span><span class="pl-kos">{</span>

    <span class="pl-k">static</span> <span class="pl-en">get</span><span class="pl-kos">(</span><span class="pl-s1">id</span><span class="pl-kos">)</span><span class="pl-kos">{</span>
        <span class="pl-k">let</span> <span class="pl-s1">list</span> <span class="pl-c1">=</span> <span class="pl-s1">instances</span><span class="pl-kos">.</span><span class="pl-en">get</span><span class="pl-kos">(</span><span class="pl-smi">this</span><span class="pl-kos">)</span> <span class="pl-c1">||</span> <span class="pl-kos">{</span><span class="pl-kos">}</span><span class="pl-kos">;</span>
        <span class="pl-k">return</span> <span class="pl-s1">list</span><span class="pl-kos">[</span><span class="pl-s1">id</span><span class="pl-kos">]</span><span class="pl-kos">;</span>
    <span class="pl-kos">}</span>

    <span class="pl-k">static</span> <span class="pl-en">add</span><span class="pl-kos">(</span><span class="pl-s1">id</span><span class="pl-kos">,</span> <span class="pl-s1">instance</span><span class="pl-kos">)</span><span class="pl-kos">{</span>
        <span class="pl-k">let</span> <span class="pl-s1">list</span> <span class="pl-c1">=</span> <span class="pl-s1">instances</span><span class="pl-kos">.</span><span class="pl-en">get</span><span class="pl-kos">(</span><span class="pl-smi">this</span><span class="pl-kos">)</span><span class="pl-kos">;</span>
        <span class="pl-k">if</span><span class="pl-kos">(</span><span class="pl-c1">!</span><span class="pl-s1">list</span><span class="pl-kos">)</span>
            <span class="pl-s1">instances</span><span class="pl-kos">.</span><span class="pl-en">set</span><span class="pl-kos">(</span><span class="pl-smi">this</span><span class="pl-kos">,</span> <span class="pl-s1">list</span> <span class="pl-c1">=</span> <span class="pl-kos">{</span><span class="pl-kos">}</span><span class="pl-kos">)</span><span class="pl-kos">;</span>
        <span class="pl-s1">list</span><span class="pl-kos">[</span><span class="pl-s1">id</span><span class="pl-kos">]</span> <span class="pl-c1">=</span> <span class="pl-s1">instance</span><span class="pl-kos">;</span>
    <span class="pl-kos">}</span>

    <span class="pl-en">constructor</span><span class="pl-kos">(</span><span class="pl-s1">id</span><span class="pl-kos">)</span><span class="pl-kos">{</span>
        <span class="pl-k">let</span> <span class="pl-s1">type</span>        <span class="pl-c1">=</span> <span class="pl-smi">this</span><span class="pl-kos">.</span><span class="pl-c1">constructor</span><span class="pl-kos">;</span>
        <span class="pl-k">let</span> <span class="pl-s1">byId</span>        <span class="pl-c1">=</span> <span class="pl-s1">type</span><span class="pl-kos">.</span><span class="pl-en">get</span><span class="pl-kos">(</span><span class="pl-s1">id</span><span class="pl-kos">)</span><span class="pl-kos">;</span>

        <span class="pl-c">// Already created. Return reference to existing instance.</span>
        <span class="pl-k">if</span><span class="pl-kos">(</span><span class="pl-s1">byId</span><span class="pl-kos">)</span><span class="pl-kos">{</span>
            <span class="pl-k">return</span> <span class="pl-s1">byId</span><span class="pl-kos">;</span>
        <span class="pl-kos">}</span>

        <span class="pl-smi">this</span><span class="pl-kos">.</span><span class="pl-c1">id</span> <span class="pl-c1">=</span> <span class="pl-s1">id</span><span class="pl-kos">;</span>
        <span class="pl-s1">type</span><span class="pl-kos">.</span><span class="pl-en">add</span><span class="pl-kos">(</span><span class="pl-s1">id</span><span class="pl-kos">,</span> <span class="pl-smi">this</span><span class="pl-kos">)</span><span class="pl-kos">;</span>
    <span class="pl-kos">}</span>
<span class="pl-kos">}</span>


<span class="pl-k">class</span> <span class="pl-v">SubtypeResource</span> <span class="pl-k">extends</span> <span class="pl-v">Resource</span><span class="pl-kos">{</span>

<span class="pl-kos">}</span>


<span class="pl-k">let</span> <span class="pl-s1">resourceA</span> <span class="pl-c1">=</span> <span class="pl-k">new</span> <span class="pl-v">SubtypeResource</span><span class="pl-kos">(</span><span class="pl-c1">200</span><span class="pl-kos">)</span><span class="pl-kos">;</span>
<span class="pl-k">let</span> <span class="pl-s1">resourceB</span> <span class="pl-c1">=</span> <span class="pl-k">new</span> <span class="pl-v">SubtypeResource</span><span class="pl-kos">(</span><span class="pl-c1">200</span><span class="pl-kos">)</span><span class="pl-kos">;</span>
<span class="pl-smi">console</span><span class="pl-kos">.</span><span class="pl-en">log</span><span class="pl-kos">(</span><span class="pl-s1">resourceA</span> <span class="pl-c1">===</span> <span class="pl-s1">resourceB</span><span class="pl-kos">)</span><span class="pl-kos">;</span> <span class="pl-c">// "true" if natively supported; "false" if transpiled</span></pre></div>
<p dir="auto">Blacklisting <code class="notranslate">es6.classes</code> solves the problem, but that naturally requires an interpreter to support it natively. I'm running the latest version of Node (4.2.1), so it's no big deal. But it'd be different if it were for client-side delivery.</p>
<p dir="auto">This only happens with subclasses, so it might have something to do with the way the transformer maps references to constructor functions. E.g., the following code runs fine either natively or through Babel:</p>
<div class="highlight highlight-source-js notranslate position-relative overflow-auto" dir="auto" data-snippet-clipboard-copy-content="console.log(new Resource(200) === new Resource(200)); // true"><pre class="notranslate"><span class="pl-smi">console</span><span class="pl-kos">.</span><span class="pl-en">log</span><span class="pl-kos">(</span><span class="pl-k">new</span> <span class="pl-v">Resource</span><span class="pl-kos">(</span><span class="pl-c1">200</span><span class="pl-kos">)</span> <span class="pl-c1">===</span> <span class="pl-k">new</span> <span class="pl-v">Resource</span><span class="pl-kos">(</span><span class="pl-c1">200</span><span class="pl-kos">)</span><span class="pl-kos">)</span><span class="pl-kos">;</span> <span class="pl-c">// true</span></pre></div>
<hr>
<p dir="auto">To summarise what my code's doing: I'm writing a Node program to scrape data from a site that lacks a formal API. Resources are loaded once and done so asynchronously, collating patches of data from numerous different sources. I thought an elegant approach would be to return references to existing instances instead of manually checking if they've been created already:</p>
<div class="highlight highlight-source-js notranslate position-relative overflow-auto" dir="auto" data-snippet-clipboard-copy-content="let instance;
if(SubtypeResource.get(id)){
    instance = SubtypeResource.get(id);
}
else{
    instance = new SubtypeResource(id);
    SubtypeResource.add(id, instance);
}"><pre class="notranslate"><span class="pl-k">let</span> <span class="pl-s1">instance</span><span class="pl-kos">;</span>
<span class="pl-k">if</span><span class="pl-kos">(</span><span class="pl-v">SubtypeResource</span><span class="pl-kos">.</span><span class="pl-en">get</span><span class="pl-kos">(</span><span class="pl-s1">id</span><span class="pl-kos">)</span><span class="pl-kos">)</span><span class="pl-kos">{</span>
    <span class="pl-s1">instance</span> <span class="pl-c1">=</span> <span class="pl-v">SubtypeResource</span><span class="pl-kos">.</span><span class="pl-en">get</span><span class="pl-kos">(</span><span class="pl-s1">id</span><span class="pl-kos">)</span><span class="pl-kos">;</span>
<span class="pl-kos">}</span>
<span class="pl-k">else</span><span class="pl-kos">{</span>
    <span class="pl-s1">instance</span> <span class="pl-c1">=</span> <span class="pl-k">new</span> <span class="pl-v">SubtypeResource</span><span class="pl-kos">(</span><span class="pl-s1">id</span><span class="pl-kos">)</span><span class="pl-kos">;</span>
    <span class="pl-v">SubtypeResource</span><span class="pl-kos">.</span><span class="pl-en">add</span><span class="pl-kos">(</span><span class="pl-s1">id</span><span class="pl-kos">,</span> <span class="pl-s1">instance</span><span class="pl-kos">)</span><span class="pl-kos">;</span>
<span class="pl-kos">}</span></pre></div>
<p dir="auto">The current implementation doesn't handle parent classes that return specific objects properly. The value returned from <code class="notranslate">[[Construct]]</code> should be used as the <code class="notranslate">this</code> binding value in the child constructor.</p>
<div class="snippet-clipboard-content notranslate position-relative overflow-auto" data-snippet-clipboard-copy-content="class Other {
    method(){
        console.log('other');
    }
}
class Base {
    constructor(){
        return new Other();
    }
    method(){
        console.log('base');
    }
}
class Sub extends Base {
    constructor(){
        super();
        this.method();
    }
}

var s = new Sub();
console.log('expected true, got ' + (s instanceof Other));"><pre class="notranslate"><code class="notranslate">class Other {
    method(){
        console.log('other');
    }
}
class Base {
    constructor(){
        return new Other();
    }
    method(){
        console.log('base');
    }
}
class Sub extends Base {
    constructor(){
        super();
        this.method();
    }
}

var s = new Sub();
console.log('expected true, got ' + (s instanceof Other));
</code></pre></div>
<p dir="auto">Seems like</p>
<div class="snippet-clipboard-content notranslate position-relative overflow-auto" data-snippet-clipboard-copy-content="var Sub = (function (_Base) {
    _inherits(Sub, _Base);

    function Sub() {
        _classCallCheck(this, Sub);

        _get(Object.getPrototypeOf(Sub.prototype), 'constructor', this).call(this);
        this.method();
    }

    return Sub;
})(Base);"><pre class="notranslate"><code class="notranslate">var Sub = (function (_Base) {
    _inherits(Sub, _Base);

    function Sub() {
        _classCallCheck(this, Sub);

        _get(Object.getPrototypeOf(Sub.prototype), 'constructor', this).call(this);
        this.method();
    }

    return Sub;
})(Base);
</code></pre></div>
<p dir="auto">should be more like</p>
<div class="snippet-clipboard-content notranslate position-relative overflow-auto" data-snippet-clipboard-copy-content="var Sub = (function (_Base) {
    _inherits(Sub, _Base);

    function Sub() {
        _classCallCheck(this, Sub);

        var _this = _get(Object.getPrototypeOf(Sub.prototype), 'constructor', this).call(this);
        if (_this === undefined) _this = this;
        _this.method();
        return _this;
    }

    return Sub;
})(Base);"><pre class="notranslate"><code class="notranslate">var Sub = (function (_Base) {
    _inherits(Sub, _Base);

    function Sub() {
        _classCallCheck(this, Sub);

        var _this = _get(Object.getPrototypeOf(Sub.prototype), 'constructor', this).call(this);
        if (_this === undefined) _this = this;
        _this.method();
        return _this;
    }

    return Sub;
})(Base);
</code></pre></div>