从Function继承时调用的异常行为

时间:2018-12-20 03:02:45

标签: javascript

我正在尝试编写一个将从Function继承的类,但无法在该类的实例上调用.call。

例如,假设我定义了构造函数:

function myFunc() {
    Function.call(this);}

我将 myFunc 的原型设置为Function的原型:

myFunc.prototype = Function.prototype

我创建新类的实例:

var f = new myFunc()

我可以看到f.\__proto\__Function.prototype

f.__proto__ === Function.prototype /=> true

并且该Function.prototype具有调用方法:

 Function.prototype.call /=> ƒ call() { [native code] }

nonetheless f.call(null)返回错误:

f.call(null) /=> VM183:1 Uncaught TypeError: f.call is not a function
at <anonymous>:1:3

这是怎么回事?

我认为f.call会检查f.\__proto\__的调用方法,但这似乎没有发生。

1 个答案:

答案 0 :(得分:1)

一个人不能简单地扩展内置类,至少不是从历史上扩展。

能够正确扩展内置类是ES6的一项功能,通常依赖于使用ES6语法。

class MyClass extends SomeBuiltin {}

ES5语法在这里不能真正起作用,它会导致对象无法正确实现内部内容,并最终导致方法失败并导致需要它(给您看似错误的调用方法错误)。

如果您的JavaScript环境支持扩展函数,那么它将起作用:

class myFunc extends Function {
    constructor() {
        super('return [...arguments]');
    }
}

const f = new myFunc();
console.log(f.call(null, 1, 2, 3)); // [1, 2, 3]

尽管如此,我还是建议不要首先扩展Function,因为它需要从字符串中进行代码评估,这是令人不愉快的,潜在的危险并且通常是不必要的。