我试图自学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)
您可以扩展(子类)任何构造函数。 使用new
运算符调用时,任何函数都可以充当构造函数(并且在没有class
的情况下无法调用ES6 new
构造函数)。因此,使用constructor
属性创建对象。
在您的情况下console
只是一个对象,而console.constructor
是Object
:
console.constructor === Object // true
你可以扩展它:
class SuperConsole extends console.constructor {
constructor() {
super();
}
// ...
}
const myconsole = new SuperConsole();
typeof myconsole.log === 'function'; // FALSE!
但是...... Object.prototype没有log
,info
,...方法,因为它们是静态附加到一个简单的对象,并且扩展它是无用的强>
顺便说一句,您可以将更多方法附加到console
对象,或将它们复制到另一个对象或构造函数prototype
,例如:
function Superconsole() {
}
Superconsole.prototype = console;
var myconsole = new Superconsole();
myconsole.log('It works');
// It works