javascript - 一个对象有可能也是一个函数吗?

标签 javascript

徒然this question .

对象有可能也是函数吗?

例如,我有对象person,它是某个对象的实例。

我是否可以调用 person(...) 并获得一些返回?

这是 person没有被定义为函数的地方。

例如,我有一个“类”人:

class Person {
     // .. some class functions
}

然后我创建一个新的

let person = new Person();

我可以调用 person() 并影响实际的对象行为吗?或者这根本不可能,而 person 本身必须首先定义为一个函数?

最佳答案

简短回答,。是的!请参阅下面的代理解决方案。

9.2.1部分该规范概述了 Function 对象的内部 [[Call]] 属性,该属性允许将该对象作为函数调用。目前我不知道如何修改该属性,即将对象创建后使其变为函数。通过完全兼容 ES 2015 的实现,可以对 Function 进行子类化并拥有可调用对象(例如,目前在 FF 中工作)。即便如此,我除了在 Function 构造函数本身上制作一层薄如纸的层之外,没有尝试任何其他事情。然而,ES 2015 还包括Proxies ,代理陷阱之一是“apply”。

class Person {
  constructor(arg, body) {
    this.fn = function(a) { this.a = a; };
    return new Proxy(this, {
      apply: function(target, thisArg, args) {
        return target.fn.apply(target, args);
      }
    });
  }
}
var person = new Person();
person(3);
person.a; //3

在 Chrome 49 中测试。在 FF 中失败,除非 Person 扩展 Function 并调用 super:

class Person extends Function {
  constructor() {
    super();
    this.fn = function(a) { this.a = a; };
    return new Proxy(this, {
      apply: function(target, thisArg, args) {
        return target.fn.apply(target, args);
      }
    });
  }
}
var person = new Person();
person(3);
person.a;

根据 MDN,关于需要 super 调用的部分至少是正确的(对于子类),但我不确定代理是否应该让您像 chrome 允许的那样调用非函数。

更新

我又打开了一个question关于哪种行为是正确的。对于那些懒得点击超链接的人来说,调用非函数是某些特定版本的 chrome 中的一个错误,现已修复。

关于javascript - 一个对象有可能也是一个函数吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36069951/

相关文章:

javascript - IE9 关联数组

javascript - 使用单选按钮显示一个 div

javascript - 与 Gridster 和 Knockout 的小部件绑定(bind)

javascript - window.location.href 改为附加或重定向

javascript - Facebook 爬虫目前是否在解析 DOM 之前解释 javascript?

javascript - 我的页面出现问题,因为 onclick 音频不起作用

javascript - Uncaught Error : [$injector:modulerr with angualrJs when i use routing

javascript - 通过将图像分成几 block 来创建图像交换页面

javascript - 如何重置每个容器元素的自动编号标题计数?

javascript - 寻找 Mongoose "hello world"示例