2012-08-30 379 views
1

基於一個問題,在此之前,我問,我怎麼有資格這串...定義自定義對象和函數在JavaScript(第2部分)

"MyCustomObject.prototype.foo.bar" 

這樣:

window['MyCustomObject']['prototype']['foo']['bar'] 

在對象形式? (它不一定符合...

"window['MyCustomObject']['prototype']['foo']['bar']" 

... as a string!)。

作爲參考,請考慮以下...(代碼是錯誤的...它需要固定(不EVAL關鍵字))

var fn = "MyCustomObject.prototype.foo.bar"; 
var ptr = fn.split('.'); 
var ptrPath = 'window' 
for(var index = 0; index < ptr.length; index++) { 
    ptrPath += '[\'' + ptr[index] + '\']'; 
} 
ptrPath = function() { 
    alert("Hello"); 
} 

要解決此;

var inst = new MyObject(); 
inst.foo.bar(); //alerts...."Hello" 

回答

0

最後經過很大的努力,我已經找到了解決方案。

的Object.implement功能背後的想法是,以允許開發者:

  1. 通過名稱定義的對象/功能(例如,「自定義」或「Custom.prototype.foo.bar」),不管那個物體是否存在。

  2. 定義對象/功能上下文(例如窗口)

  3. 定義對象/功能實現

  4. 定義是否覆蓋對象/功能如果一個實現已經存在。

考慮Object.implement代碼示例:

Object.implement = function(fn, context, implementation, override) { 
    var properties = fn.split('.'); 
    var fnName = properties.pop(); 
    for(var index = 0; index < properties.length; index++) { 
     if(!context[properties[index]]) { 
      context[properties[index]] = { }; 
     } 
     context = context[properties[index]]; 
    } 
    if(!context[fnName] || override) { 
     context[fnName] = implementation; 
    } 
}; 

我現在可以用它來安全地創建/實施對象和函數。認爲這是一個有點像「中間層」的功能,在這裏如果功能不存在,可以提供一個實現,然而與現有的功能可能被過度纏身以及附加功能:

Object.implement("HashTable", window, function() { }, true); 
Object.implement("HashTable.prototype.bar", window, function() { alert("Hello World") }, true); 

var ht = new HashTable(); 
ht.bar(); 

它的工作原理在FireFox中...我還沒有在其他瀏覽器中測試!

0

我修改了答案this question以滿足您的需求。

var getPropertyByName = function (fullString, context) { 
     var namespaces = fullString.split("."); 
     var functionName = namespaces.pop(); 

     for (var i = 0; i < namespaces.length; i++) { 
      context = context[namespaces[i]]; 
     } 

     return context[functionName]; 
}; 

getPropertyByName('MyCustomObject.foo.bar', window); 

http://jsfiddle.net/jbabey/4GVUK/

+0

您的解決方案是否需要'MyCustomObject.foo.bar'才能實現,然後才能返回非undefined的內容? - 基本上我想要一個函數來限定字符串(在本例中)屬性,然後可以賦值(或實現)屬性,但有時可能該屬性不存在於第一位,因此函數賦值將是該屬性第一次被定義......我希望這是有道理的!? – series0ne

+0

@activwerx不,它只會在它已經被定義時才起作用 – jbabey

+0

:-(有什麼辦法可以做到嗎?例如,我可以做window ['CustomObject'] = function(){};然後我將擁有一個名爲CustomObject的可構造對象,但我希望能夠對嵌套屬性做同樣的工作。 – series0ne

0

你可以試試這個方法:

var fn = "foo.prototype.bar"; 
var ptr = fn.split('.'); 
var func = ptr.reduce(function(a, b){ 
    return a[b] ? a[b] : a; 
}, window); 

The working demo.

+0

我終於搞清楚了我想要做的事情,請考慮我的答案,並酌情給予反饋或批評。 – series0ne

相關問題