2014-07-22 77 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 | +------------------+ 
+-----------+