2014-07-22 73 views
1

主要對象我有這樣的對象:的JavaScript訪問來自withing財產

var myObj = new function(){ 
    this.dateInfo = "someinfo"; 
} 

,然後我有以下特性:

myObj.add = function(){ 
    console.log("Added"); 
} 
myObj.remove.item = function(key){ 
    console.log("Item "+key+" removed."); 
} 

問題就在這裏:

myObj.remove.undo = function(key){ 
    // here I want to use `myObj.add()` function, what should I do? 
} 

在上面的(最後)功能中,我想利用myObj.add(),我該如何參考它?我知道this沒有做到這一點(從remove.undo()內)。

我需要幫助。謝謝。

+5

我建議你只需用'removeItem','removeUndo'等去,這會讓一切更容易。由於'this'是動態的,所以當你有很多嵌套的對象和函數時很難跟蹤它。 – elclanrs

回答

2

這是可能,因爲你的myObj是一個單獨的  —只是用它直接,密切在myObj變量的函數:

myObj.remove.undo = function(key){ 
    myObj.add(/*...*/); 
} 

下面是第二種方式,這也依賴於myObj是一個單身人士(雖然這可以被修改爲支持多個對象):

myObj.add = function(){ 
    console.log("Added"); 
}; 

myObj.remove = { 
    parent: myObj 
}; 

myObj.remove.item = function(key){ 
    console.log("Item "+key+" removed."); 
}; 

myObj.remove.undo = function(key){ 
    this.parent.add(/*...*/); 
}; 

雖然,我再次「T。我倒是可以:

  1. 使用removeItemremoveUndo等作爲elclanrs建議。

  2. 使用itemsundos性能,這是該項目和「撤消」 S的問題,並給他們addremove方法(和它們的父對象的引用,我與上述remove的方式。


旁註:

var myObj = new function(){ 
    this.dateInfo = "someinfo"; 
}; 

...是一個漫長而wastef UL的方式來寫

var myObj = { 
    dateInfo: "someinfo" 
}; 

第一種方式創建了一個函數和一個額外的對象,這兩個雜波內存沒有很好的理由(爲myObj指他們兩個,通過其原型,因此JavaScript引擎已保留在內存中):

+-----------+ 
| myObj | 
+-----------+  +-------------+ 
| __proto__ |----+>| (object) | 
| dateInfo | /+-------------+  +------------------+ 
+-----------+ | | __proto__ |------>| Object.prototype | 
       | | constructor |---+ +------------------+ 
       | +-------------+ | 
       |     | 
       |     | +------------+ 
       |     +-->| (function) | 
       |      +------------+ 
       |      | __proto__ |---->(omitted, not relevant) 
       |      | prototype |--+ 
       |      +------------+ | 
       |          | 
       +----------------------------------------+ 

第二條路並不:

+-----------+ 
| myObj | 
+-----------+ +------------------+ 
| __proto__ |--->| Object.prototype | 
| dateInfo | +------------------+ 
+-----------+