javascript - 从 Function 继承时调用的意外行为

标签 javascript

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

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

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

我将 myFunc 的原型(prototype)设置为 Function 的原型(prototype):

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] }

尽管如此 f.call(null) 返回一个错误:

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

这是怎么回事?

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

最佳答案

人们不会简单地扩展内置类,至少在历史上不会。

正确扩展内置类的能力是 ES6 的一个特性,它通常依赖于使用 ES6 语法。

class MyClass extends SomeBuiltin {}

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

如果您的 JavaScript 环境支持扩展 Function,这将有效:

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

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

不过,我倾向于建议不要首先扩展 Function,因为它需要从字符串中进行代码评估,这是令人不快的、有潜在危险的,而且通常是不必要的。

关于javascript - 从 Function 继承时调用的意外行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53861887/

相关文章:

javascript - 如果选择相同的文件路径,Svelte 文件输入不会触发 react 性

javascript - 使用 Javascript 和 HTML 表单向 Facebook 提交图像

Javascript 对象引用种类的最后一个对象而不是自身

JavaScript、JQuery 上一个按钮

javascript - 如何使用 JQuery 将 div 放置在鼠标单击旁边?

javascript - 在 Fullcalendar 中,最长的事件总是垂直排列在最前面吗?

javascript - 如何使用javascript将对象作为键存储在数组中

javascript - 在 CKEditor 上自动上传图像

javascript - 像 Object.defineProperty 这样的函数可以在 javascript 中创建通用的 getter/setter 吗?

javascript - Accordion 防止点击链接