确保这是指对象

时间:2015-06-06 11:47:10

标签: javascript

我有以下对象:

isLoggedIn

现在我需要开始将函数console.log(req.flash('loginMessage'))传递给不同上下文中的API。我的问题是dog = { location: { x: 52.1089, y: 16.2323 }, f: function(message) { alert(message + this.location.x); return; } }; 并不总是指我的对象,而是指不同的东西,这取决于它的调用方式。如何在函数dog.f中访问this等属性?

编辑:我真正想要的只是方法location,但我不想在每个函数调用中初始化f内的位置,所以我认为对象是最好的主意。这是我的第一次尝试:

f

但在每个函数调用中初始化位置看起来都很浪费。

编辑2:我愿意接受咖啡因解决方案

3 个答案:

答案 0 :(得分:4)

您可以使用bind method设置方法的上下文:

var func = dog.f.bind(dog);

当您从任何地方拨打func时,它将具有与被称为dog.f时相同的上下文。

注意:旧版浏览器不支持bind方法,例如IE 8及更早版本,因此您需要使用' polyfill'如果你需要支持那些。我链接到的文档中有一个。

答案 1 :(得分:2)

您可以考虑使用闭包(请参阅Private Members in JavaScript):

var dog = (function() {
  var location = {x: 52, y:16};
  return {
    getLocation: function() {
      return [location.x, location.y];
    },
    setLocation: function (newX, newY) {
      location.x = newX;
      location.y = newY;
    },
    showMessage: function(message) {
      alert(message + location.x);
    }
  };
}());

dog.showMessage('here : ');

答案 2 :(得分:0)

您可能想要这样做

var Dog = function() {
  this.location = {
    x: 52.1089,
    y: 16.2323
  };
  this.f = function(message) {
    alert(message + this.location.x);
    return;
  }
};

var dogObj = new Dog();

dogObj.f("Hellow World!");