2011-05-19 71 views
2

我有這個對象。
fieldsCreator的成員持有每個字段的創建者方法。
我的問題是我怎麼能叫內fieldsCreators創始人方法如下所述:我怎樣才能到「父母」的方法?

var obj={ 
    creator:function(ch) { 
     .... 
     .... 
     .... 
    }, 
    fieldsCreators:{ 
      INVITER: function() { 
       return creator('a'); //HOW DO I CALL creator METHOD? 
      }, 
      CUSTOMER: function() { 
       return creator('b'); //HOW DO I CALL creator METHOD? 
      } 
    } 
} 

回答

2

您也可以使用這樣的模式:

var obj = (function() { 

    var methods = { 
     creator: function(ch) { 

     }, 
     fieldsCreators:{ 
      INVITER: function() { 
       return methods.creator('a'); 
      }, 
      CUSTOMER: function() { 
       return methods.creator('b'); 
      } 
     } 
    }; 

    return methods; 
})(); 

這有什麼用?假設你想讓所有的方法訪問一個變量,但只能在obj中看到。如果obj只是一個對象,你就無法做到這一點,它需要一個函數的範圍。例如:

var obj = (function() { 

    // everything declared with var won't be visible to the rest 
    // of the application, which is good encapsulation practice. 
    // You only return what you want to be publicly exposed. 
    var MYPRIVATEINFO = "cheese"; 

    var methods = { 
     creator: function(ch) { 
      // you have access to MYPRIVATEINFO here 
      // but the rest of the application doesn't 
      // even know about it.  
     }, 
     fieldsCreators:{ 
      INVITER: function() { 
       return methods.creator('a'); 
      }, 
      CUSTOMER: function() { 
       return methods.creator('b'); 
      } 
     } 
    }; 

    return methods; 
})(); 

如果你不希望有命名對象,可以構建像這樣,這就是爲什麼有一個私密的環境是關鍵:

var obj = (function() { 

    var creator = function(ch) { 

    }; 


    return { 
     // if you wish, you can still expose the creator method to the public: 
     creator: creator, 
     fieldsCreators: { 
      INVITER: function() { 
       return creator('a'); 
      }, 
      CUSTOMER: function() { 
       return creator('b'); 
      } 
     } 
    }; 
})(); 
+0

爲什麼你的例子是Amir Raminfar解決方案的更好解決方案? – 2011-05-19 15:18:58

+0

它允許你有一個私人的環境。我將更新關於如何做到這一點的帖子。 – Eli 2011-05-19 15:19:57

+0

除了Eli說你可以選擇哪些方法是私人的和公開的,它的確是一樣的。但是再次使用'方法'就像使用'obj' – 2011-05-19 15:23:55

2

是否obj.creator(...)不行?

您正在定義一個名爲'obj'的實例,因此您應該可以使用該名稱。

EDIT-- 這可能是你想要的 -

var obj={ 
    creator:function(ch) { 
     .... 
     .... 
     .... 
    }, 
    self : this, 
    fieldsCreators:{ 
      INVITER: function() { 
       return self.creator('a'); //HOW DO I CALL creator METHOD? 
      }, 
      CUSTOMER: function() { 
       return self.creator('b'); //HOW DO I CALL creator METHOD? 
      } 
    } 
} 
+0

是不是有沒有obj的情況下有可能獲得創建者方法?我不想依賴變量名稱中的fieldsCreators。 – 2011-05-19 15:17:24

+0

有,但你有單身,沒有意義不使用OBJ。但我想我知道你的意思。看看我的編輯很快。 – 2011-05-19 15:19:38

+0

但是,除非它不需要單身,那麼我建議使用obj。 – 2011-05-19 15:22:34