你能得到一个方法的对象吗?

时间:2016-03-19 22:49:45

标签: javascript

我只是想知道我是否可以将一些辅助函数(对于像长凳,日志记录和缓存这样的东西)做得更整洁。现在我正在做这个

SheetService

所以我可以像这样使用它

function doSomethingToMethodsObject(object, methodname) {
    //do things to object and object[methodname]
}

但如果我可以这样称呼它会更好

var myObject = function() {
    this.myString = "hello";
    this.myMethod = function() { return this.myString; }.bind(this);
    doSomethingToMethodsObject(this, "myMethod");
}

然后在doSomethingToMethodsObject中分解对此函数的引用和“myMethod”。

那么有没有办法弄清楚函数属于哪些对象?

2 个答案:

答案 0 :(得分:1)

  

那么有没有办法弄清楚函数属于哪些对象?

函数不仅属于单个对象。在许多不同的对象上可以有很多对相同函数的引用。所以,你不能通过纯粹看函数来具体弄清楚一个函数属于哪个对象。

事实上,为什么你将this.myMethod作为参数传递,与传递的this部分没有任何联系。它只是获取对函数的引用并传递它。

您可以使用.bind()传递对函数的绑定引用,但这只允许您在正确对象的上下文中调用该方法 - 它不允许您将对象与方法。如果你在函数中分别需要对象和方法,那么你需要找到一些方法让它们在函数内部可单独访问 - 最明显的方法是将它们作为参数传递。

根据具体情况(您并非真正共享的内容),有时您可以使用父范围变量(如var self = this;)来维护对this的引用,以便进行访问通过儿童功能,但我不确定这适用于您正在做的事情。

以下是一些选项:

doSomethingToMethodsObject(this, this.myMethod);

doSomethingToMethodsObject({obj: this, method: this.myMethod});

答案 1 :(得分:0)

当您使用this.myMethod时,JS会创建一个基数为this且引用名称为"myMethod"的引用。

但是,当您将其用作参数时,JS会将引用解析为属性值。因此,在doSomethingToMethodsObject中,获得基数为时已晚。

获取this.myMethod基础的唯一方法是myMethod是一个具有getter的访问器属性,该getter重定向到基础对象值。然后,您可以在getter中使用this,并将其存储在基础值的属性中。

例如:

var obj = {
  _myMethod: function(arg) { /* Underlying function */
    return {thisArg: this, arg: arg};
  },
  get myMethod() { /* Stores reference parts and redirects */
    return Object.assign(this._myMethod, {
      refBase: this,
      refName: "_myMethod"
    });
  }
};
function doSomethingToMethodsObject(value) {
  return value.call(
    value.refBase,
    value === value.refBase[value.refName]
  );
}
obj.myMethod(123); // {thisArg: obj, arg: 123}
doSomethingToMethodsObject(obj.myMethod); // {thisArg: obj, arg: true}