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 に答える