2016-01-09 53 views
2

我有一個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) 
    } 
    } 
} 

我要訪問的「a」從O或P,這裏是代碼:

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執行?

+0

s.obj.m.n.o.call(s)should work。我不認爲你可以用s.obj.m.n.p()做很多事情,因爲p正在返回一個函數。 – blessenm

+0

Javascript對象沒有父對象的概念,因此除非您專門在自己的屬性中存儲父引用,否則您無法從子對象中訪問該對象。這部分是因爲子對象僅在父屬性中作爲引用存在,並且可以在許多對象中引用它。換句話說,一個孩子實際上並不是由任何特定的父母擁有的。它只是一個屬性的參考,可能是許多不同對象的參考。 – jfriend00

回答

-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() 

UPDATE:

正如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()); 

這個代碼和操作的代碼之間的區別在於obj與每個服務實例的屬性,而OP的代碼將OBJ作爲通用屬性服務類。

此外,我設置obj屬性來調用objFunc類,以便他可以作爲s.obj.m.n.o()訪問它。如果我沒有,他將不得不作爲s.obj()。m.n.o()來訪問它。

我希望這是他的想法和想法。

+0

'this_'是一個全局變量 - 創建第二個新服務和's.obj.m.n.o()'不會像你所期望的那樣工作。此外,這並沒有解決這個問題's.obj.m.n.p()' –

+0

@Jaromanda - 我不知道this_是一個全局變量,你有一個我可以讀到這個網址嗎?謝謝 – Will

+0

你能否在非全局範圍內看到'this_'聲明爲'var this_'?我也沒有什麼 - 沒有什麼特別的名字'this_' - 這就是你是如何(不)宣佈它使它成爲全球 - 你不需要我給你一個鏈接 - 它的JavaScript 101 –