2011-05-24 81 views
0

我该怎么做?JavaScript绑定对象

var Factory = (function() { 

    var Class = function() { 

    this.name = 'John'; 

    this.methods = { 
     get: function(callback) { 
     callback(); 
     } 
    }; 

    }; 

    return { 
    createClass: function() { 
     return new Class(); 
    } 
    }; 

}()); 

使用

var MyClass = Factory.createClass(); 

MyClass.methods.get(function() { 
    this.name // => returns undenfined 
}); 

感谢您的帮助!

+0

其实只有函数调用得到,什么你问题的意思吗?并发布您的确切问题。 – 2011-05-24 13:22:19

+0

是的,你怎么可能! – KooiInc 2011-05-24 13:33:39

+0

哎呀,'我怎么能这样做?'... – 2011-05-24 13:37:51

回答

2

您需要在外部Class功能保存到this参考,并调用call

var instance = this; 

this.methods = { 
    get: function(callback) { 
    callback.call(instance); 
    } 
}; 
+0

感谢您的快速回复!这是唯一的解决方案吗? – 2011-05-24 13:32:47

0
var Class = function() { 
    // Save a reference to this that can be used in local closures. 
    var me = this; 

    this.name = 'John'; 

    this.methods = { 
     get: function(callback) { 
      // Use 'call()', passing the reference to the 'Class' object 
      callback.call(me); 
     } 
    }; 
}; 
0

@SLaks - 的范围内声明的全局变量是不好的做法。 @Ferdinand拜亚尔 - 你测试过它的功能吗?

更好的方法将是范围绑定。 JavaScript原型框架生成一个很好的概念,我们可以很容易地实现它像

Function.prototype.bind = function(scope) { 
    var _function = this; 

    return function() { 
    return _function.apply(scope, arguments); 
    } 
} 

然后yoou代码应该只有一个变化,它会maintin类的范围。

var Factory = (function() { 

    var Class = function() { 

    this.name = 'John'; 
    var me = this; 
    this.methods = { 
     get: function(callback) { 

     callback(); 
     } 
    }; 

    }; 

    return { 
    createClass: function() { 
     return new Class(); 
    } 
    }; 

}()); 

var MyClass = Factory.createClass(); 



MyClass.methods.get(function() { 
    console.info(this.name) // => returns undenfined 
}.bind(MyClass)); 

我指的是.bind(MyClass的)

+0

我的答案不使用任何全局变量。 – SLaks 2011-05-24 16:36:37

+0

费迪南德的答案与我的答案相同,但具有不同的变量名称 – SLaks 2011-05-24 16:43:17