通常,调用this
会起作用;但我在另一个上下文中调用该方法,因此this
引用该上下文而不是“父”对象。
以下是代码:
var someConfig = {
things: [
{
attr1: 'foo',
attr2: 'bar',
action: function() {
console.log(this);
}
}
]
}
function Constructor(config) {
var self = this;
self.name = 'test';
self.things = config.things;
$.each(self.things, function(i, thing) {
thing.action();
});
}
var obj = new Constructor(someConfig);
console.log(obj);
Here's a jsfiddle。目标是使控制台中的两个对象相同,但this
方法上下文中的action
返回action
所属的原始对象,而不是构造
我唯一能想到的就是将self
传递给action
,但我认为还有更好的方法。
答案 0 :(得分:3)
首先,关于代码的几点意见。您的配置属性为uniqueAction
,稍后您将其称为config.action
。当您致电obj.action
时,您需要将其称为以下功能:obj.action();
考虑到这一点,以下似乎可以满足您的需求......
var config = {
action: function() {
console.log(this.name);//<- IMPORTANT PART
}
}
function Constructor(config) {
var self = this;
self.name = 'test';
self.action = config.action;
}
var obj = new Constructor(config)
obj.action();
请注意,console.log
来电现在使用this.name
代替self.name
。
答案 1 :(得分:1)
传递给构造函数的函数是否可以访问构造函数的其他属性?
是的,但前提是您将该对象传递给该函数(或隐式使用this
keyword)。
您尝试的是从构造函数外部声明的函数访问本地self
变量,这是不可能的。
所以只需使用
{
action: function() {
console.log(this.name);
// ^^^^
}
}
在致电obj.action()
时,this
会指向该实例。
答案 2 :(得分:1)
我看到的唯一方法是在调用thing
之前将'构造函数'添加到配置action
。
查看this Fiddle,它已经分拆出来了。 我改变了两件事:
首先,action
函数不再引用this
,而是引用parent
的属性this
。
action: function() {
console.log(this.parent);
// ^^^^^^^
}
其次,每个thing
对象都会收到一个parent
属性,该属性引用self
。
$.each(self.things, function(i, thing) {
thing.parent = self;
thing.action();
});