我正在尝试编写一个将从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\__
的调用方法,但这似乎没有发生。
答案 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
,因为它需要从字符串中进行代码评估,这是令人不愉快的,潜在的危险并且通常是不必要的。