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

时间:2016-03-17 19:27:25

标签: javascript

徒劳this question

对象也可以成为一个函数。

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

我是否可以致电person(...)并回复给我一些回复?

这是人们被定义为开始的功能的地方。

例如,我有“类”人:

class Person {
     // .. some class functions
}

然后我创建一个新的

let person = new Person();

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

1 个答案:

答案 0 :(得分:1)

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

在规范的9.2.1部分中,它概述了Function对象的内部[[Call]]属性,该属性允许将该对象作为函数调用。目前我无法修改该属性,即在创建对象后将其置于函数中。通过完全兼容的ES 2015实现可以实现子类的功能并具有可调用对象(例如,当前在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.除非Person扩展Function并调用super:

,否则在FF中失败
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中的一个错误,该错误已被修复。