2013-01-10 66 views
2

通常,致电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。目标是使控制台中的两个对象相同,但action方法的上下文中的this将返回action所属的原始对象,而不是构造函数。

我唯一能想到的就是将self转换成action,但我认为还有更好的办法。

回答

1

我看到的唯一方法是在调用action之前将'构造函数'加到配置thing上。

退房this Fiddle,这是分叉你的。 我已经改变了两件事情:

首先,action功能不再引用this,但this而财产parent

action: function() { 
    console.log(this.parent); 
//     ^^^^^^^ 
    } 

其次,每个thing对象接收到一个parent属性,它引用self

$.each(self.things, function(i, thing) { 
    thing.parent = self; 
    thing.action(); 
    }); 
+0

谢谢。这对我有意义。我是面向对象的新手,所以我想我的问题是,这是我的设计不好,还是只是一个JavaScript特性?我通常希望对象的方法可以访问所有对象的数据。我应该在这里延伸吗? –

+0

呃...考虑到(在Javascript中),单个函数可能是一个属性,它被添加到了多个不同的对象_at同时,它应该引用哪个对象的数据? – Martijn

+1

在这种情况下,我想我会将'things'的成员直接复制到'self'中,以便您可以在函数中简单使用'this'。扩展将是一个更好的方法来到这里(把它们放在'Constructor'的'prototype'上)。 – Martijn

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

Here is a working example

+0

感谢您的修改,我修复了我的代码。另外,我还不够具体。 'this'不起作用,因为我在另一个上下文中调用函数。我还更新了我的代码以反映这一点。 –

+0

@SamSelikoff:请创建一个表明它不起作用的[http://jsfiddle.net/](JSFiddle) – musefan

+0

@SamSelikoff:就你而言,'this'实际上是_does_工作。当你调用'obj.action()'时,'this'会反映'obj'。你究竟在做什么,不是? – Martijn

1

功能可以传递到构造都可以访问到构造的其他属性?

是的,但是只有当你传递对象的函数(或隐式使用this keyword)。

你所做的尝试是从一个在构造函数外声明的函数访问本地self变量,这是不可能的。

调用obj.action()this时将指向实例,这样只需使用

{ 
    action: function() { 
    console.log(this.name); 
//    ^^^^ 
    } 
} 

和。

相关问题