2016-11-17 1 views
0

JavaScriptクラスを自分で教えようとしていましたが、私は理解できません。誰かがなぜこれらのスニペットを実行したときに私が異なる結果を得ているのか説明してもらえますか?非コンストラクタをサブクラス化する

class Foo extends console { } // TypeError: console is not a constructor 

これは完全に意味があります。コンストラクタではない関数を拡張しようとするとエラーになります。

しかし、私が他の非コンストラクタでこれを試してみると、物事は異なります。

class Bar extends Symbol { } // This works 
let bar = new Bar();   // TypeError: Symbol is not a constructor 

私は違いを理解していない:私は同じエラーを取得していますどちらの場合も、時にはクラス宣言と他の時代に、私は私のサブクラスのインスタンスを作成しようとする場合にのみ。

+0

コンソールは、我々はにconsole.logを呼び出すなぜそれが( –

+0

ザッツ対象であるコンストラクタではありません)console.warn()、console.error()など –

+0

'TypeError:Symbolはコンストラクタではありません。 'を再現できません。 –

答えて

0

コンストラクタを拡張(サブクラス化)することができます。 関数は、new演算子で呼び出されたときにコンストラクターとして機能できます(そして、を除いてES6 classコンストラクターを呼び出すことはできません)。したがって、オブジェクトはconstructorプロパティで作成されます。あなたのケースでは

consoleがちょうどオブジェクトで、console.constructorObjectです:

console.constructor === Object // true 

、あなたはそれを拡張することができます:

class SuperConsole extends console.constructor { 
    constructor() { 
    super(); 
    } 
    // ... 
} 

const myconsole = new SuperConsole(); 
typeof myconsole.log === 'function'; // FALSE! 

けど...のObject.prototypeにはありませんloginfo、...メソッドは単純なオブジェクトに静的に付加されており、拡張するために無駄です

ところであなたはconsoleオブジェクトに複数のメソッドを添付、または別のオブジェクトまたはコンストラクタprototypeにコピーし、たとえばことができます。

function Superconsole() { 
} 

Superconsole.prototype = console; 

var myconsole = new Superconsole(); 
myconsole.log('It works'); 
// It works 
関連する問題