子类化非构造函数

时间:2016-11-17 08:02:18

标签: javascript class ecmascript-6

我试图自学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

我不明白其中的区别:在这两种情况下我都会得到相同的错误,但有时在类声明中,有时只在我尝试创建子类的实例时。

1 个答案:

答案 0 :(得分:0)

您可以扩展(子类)任何构造函数使用new运算符调用时,任何函数都可以充当构造函数(并且在没有class的情况下无法调用ES6 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