0

_self始终可以访问对象的正确方法是什么?使用_self没问题,还是不好的做法?

我想要一个很好的方法来获取 myObject 的属性和方法,即使是在 myObject 的上下文中没有调用的函数。有一些解决方案,如.bind(this)、 using_self和 jQuery 的$.proxy().

例如:

var myObject = {
  name: 'Tyrion',
  alias: 'imp',
  _self: function() {
    return this;
  },

  // I know this context is fine, but let's pretend it's being called from elsewhere.
  getAlias: function() {
    var _self = myObject._self();
    return _self.alias;
  } 
}
4

3 回答 3

0

由函数的调用决定。(又名,调用函数的方式)有关更多详细信息,请参阅我的其他答案

var myObject = {
    name: 'Tyrion',
    alias: 'imp',
    _self: function () {
        return this;
    },

    // I know this context is fine, but let's pretend it's being called from elsewhere.
    getAlias: function () {
        var _self = myObject._self();
        return _self.alias;
    }
};

//member invocation
console.log(myObject._self() === myObject); // true

var aFucntion = myObject._self;
//functional invocation
console.log(aFucntion() === myObject); // false
console.log(aFucntion() === this); //true

无需担心的上下文,一种解决方法是将分配给外部函数中的值,然后在内部函数中访问该值。这称为闭包

var MyObject = function (title) {
    var _self = this,
        helper = function () {
            return _self.title + " " + _self.name;
        };
    this.title = title;
    this.fullName = function () {
        return helper(); //functional invocation
        //if helper used this, this would be global
    };
    this.name = 'Tyrion';
    this.alias = 'imp';
    this.getAlias = function () {
        //access to _self through closure
        return _self.alias;
    };
};

//constructor invocation
var aObject = new MyObject("Mr.");
console.log(aObject.getAlias()); //imp
console.log(aObject.fullName()); //Mr. Tyrion

供参考:

如果 _self 返回 myObject,则上下文无关紧要。

_self: function () {
        return myObject;
    }
于 2013-07-07T05:50:40.210 回答
0

你也可以这样做,但我不一定会推荐它。

var obj = {
  _self: this.obj, // if you don't have .obj it points to window
  thing: 'thingy',
  alsoThis: function() {
    return 'another thing'
  }
};

obj._self;

也有可能由于它不在闭包或函数中,this._self如果上下文被其引用的范围更改,则上下文可能不正确。

通常,我只是var _self = this;在我嵌套另一个函数的函数之前执行此操作,该函数需要this父函数之外的上下文,因为嵌套的函数将无法访问嵌套的 this 的值。

在我的经验中,这通常不太常见,你真的不应该声明这样一个需要用于 _self vars 服务目的的属性/var。这不是一个好的做法,最好不要这样做。

如果遇到需要 _self = 其他上下文的情况怎么办?

于 2013-07-07T04:47:16.480 回答
0

为了做你想做的事,你必须改变一些事情。@elclanrs 关于您的this上下文是正确的。我将在下面提出两个选项。

var myObject = {
  name: 'Tyrion',
  alias: 'imp',
  // I know this context is fine, but let's pretend it's being called from elsewhere.
  getAlias: function() {
    // you'd have to do this in every method.
    var _self = this;
    return _self.alias;
  } 
}

另一个选项有点不同,并且不那么可用,但我添加它以便您可以看到它:

var myObject = function() {
    var _self = this;
    _self.name = 'Tyrion';
    _self.alias = 'imp';
    _self.getAlias = function() {
        return _self.alias;
    };
};

在第二种情况下,getAlias作为原型方法会更好,但您将无法访问_self变量,只有this.

于 2013-07-07T03:21:49.490 回答