我只是想知道我是否可以将一些辅助函数(对于像长凳,日志记录和缓存这样的东西)做得更整洁。现在我正在做这个
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”。
那么有没有办法弄清楚函数属于哪些对象?
答案 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}