2016-11-17 193 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

控制台不是构造函数是一个对象 –

+0

这就是为什么我们叫的console.log( )console.warn(),console.error()等 –

+0

我不能重现你的TypeError:符号不是构造函数。 –

回答

0

可以扩展(子类)任何构造任何功能可以作为构造行为称为与new操作时(和ES6 class构造不能没有new被调用)。因此,使用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