如何从对象中的对象访问“this”

时间:2016-01-09 00:57:07

标签: javascript node.js this bind

我有一个像这样的js对象:

let service = function () {
  this.a = 100;
}

service.prototype.func = function() {
  console.log(this.a)
}

service.prototype.func2 = function () {
  console.log('func2')
  this.func();
}

service.prototype.obj = {
  m: {
    n: {
      o: function() {
        this.func2();
      },
      p: service.prototype.func2.bind(service.prototype)
    }
  }
}

我想从o或p访问'a',这是代码:

let s = new service();
console.log(s.a)
s.func()
s.func2()
s.obj.m.n.p()
s.obj.m.n.o()

,输出

100
100
func2
100
func2
undefined
test.js:20
        this.func2();
             ^

TypeError: this.func2 is not a function

我是否知道如何正确编写o / p以执行func2?

1 个答案:

答案 0 :(得分:-1)

这个怎么样?

var service = function() {
    this_ = this;
    this.a = 100;
}

service.prototype.func = function() {
    console.log(this.a)
}

service.prototype.func2 = function() {
    console.log('func2')
    this.func();
}

service.prototype.obj = {
    m: {
        n: {
            o: function() {
                this_.func2();
            },
            p: service.prototype.func2.bind(service.prototype)
        }
    }
}

var s = new service();
console.log(s.a)
s.func()
s.func2()
s.obj.m.n.p()
s.obj.m.n.o()

更新:

正如Jaromanda X所指出的那样,我正在更新代码,以便在不定义全局变量的情况下执行OP所需的内容(我忘记了这一点)。

var service = function(v) {
    this.a = v;
    this.obj = this.objFunc(this);
}

service.prototype.func = function() {
    console.log(this.a)
}

service.prototype.func2 = function() {
    console.log('func2')
    this.func();
}

service.prototype.objFunc = function(self) {
    return {
        m: {
            n: {
                o: function() {
                    self.func2();
                },
                p: service.prototype.func2.bind(service.prototype)
            }
        }
    };
}


var s = new service(100);
var s2 = new service(200);

s.func();
s2.func();

s.obj.m.n.o());
s2.obj.m.n.o());

此代码与OP代码之间的区别在于obj是每个服务实例的属性,而OP的代码将obj设置为服务类的通用属性。

另外,我设置obj属性来调用objFunc类,这样他就可以像s.obj.m.n.o()那样访问它。如果我不这样做,他将不得不以s.obj()。m.n.o()来访问它。

我希望这是他想到的和想要的。