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

그게 전부입니다 (생성자되지 않습니다 :

는 Btw는 당신이 console 객체에 더 많은 방법을 첨부하거나 다른 객체 또는 생성자 prototype 예에 복사 할 수 있습니다) console.warn(), console.error() etc. –

+0

'TypeError : Symbol is not constructor'을 재현 할 수 없습니다. –

답변

0

생성자을 확장 (서브 클래스) 할 수 있습니다. 함수는 new 연산자로 호출 될 때 함수를 생성자로 사용할 수 있습니다 (및 new 없이는 ES6 class 생성자를 호출 할 수 없습니다). 따라서 객체는 constructor 속성으로 생성됩니다. Object.prototype에 그렇지 ...

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

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

을하지만 : 귀하의 경우 console

단지 객체이며, console.constructorObject입니다 :

console.constructor === Object // true 

당신이 그것을 확장 할 수 log, info, ... 메서드는 단순한 개체에 정적으로 첨부되어 있기 때문에 확장하는 것은 쓸데없는 것입니다.

function Superconsole() { 
} 

Superconsole.prototype = console; 

var myconsole = new Superconsole(); 
myconsole.log('It works'); 
// It works