2012-08-27 87 views
3

要明確一點,繼承DynamicObject的類(當然是C#)和JavaScript的變量是動態的不一樣。動態對象允許實現者以編程方式確定對象具有哪些成員,包括方法。JavaScript等價於C#的DynamicObject?

編輯:據我所知,JavaScript對象在運行時可以添加任何成員。這根本不是我說的。這裏是展示DynamicObject做什麼的C#示例:

public class SampleObject : DynamicObject 
{ 
    public override bool TryGetMember(GetMemberBinder binder, out object result) 
    { 
     result = binder.Name; 
     return true; 
    } 
} 

dynamic obj = new SampleObject(); 
Console.WriteLine(obj.SampleProperty); 
//Prints "SampleProperty". 

當obj的成員被訪問時,它使用TryGetMember以編程方式確定該成員是否存在以及它的值是。簡而言之,成員的存在是在請求時確定的,而不是在手邊添加。我希望這個問題稍微澄清一下。如果你想知道,我想,以確定是否有可能使對象在JavaScript中,當函數調用語法就可以使用像這樣:

myAPI.uploadSomeData(data1, data2) 

的uploadSomeData通話變爲「 TryGetMember「函數,它使用名稱」uploadSomeData「執行$ .ajax調用來生成URL,返回值是結果。

+12

除非我誤解了你的問題,Javascript對象都是這樣做的。在任何時候,您都可以在任何Javascript對象上創建新的屬性和函數。 –

+2

'for(var myobject中的屬性){console.log(property); }' – Andreas

+1

我有一些關於JavaScript的相關問題,可能對您有些用處。 – series0ne

回答

1

JavaScript允許遍歷對象的屬性和for...in循環中的方法。 您可以確定它是使用typeof運算符的方法。

HTML:

<ul id="console"></ul>​

的JavaScript:

var Application = (function(app) { 
    app.constants = app.constants || {}; 
    app.constants.PRINT_OBJ_TITLE = '[Printing an object]'; 

    app.console = { 
     constants: { 
      SEPARATOR: new Array(50).join('-') 
     }, 
     output: document.getElementById('console'), 
     log: function() { 
      var li = document.createElement('li'); 
      li.innerHTML = Array.prototype.join.call(arguments, ''); 
      this.output.appendChild(li); 
     }, 
     printSeparator: function() { 
      this.log(this.constants.SEPARATOR); 
     } 
    }; 

    app.printObj = function(obj) { 
     this.console.log(app.constants.PRINT_OBJ_TITLE); 
     for(var prop in obj) { 
      if(obj.hasOwnProperty(prop)) { 
       var propType = (typeof obj[prop] == 'function') 
        ? 'function' 
        : 'property'; 
       this.console.log(propType, ': ', prop); 
      } 
     } 
     this.console.printSeparator(); 
    }; 

    return app; 
})(Application || {}); 


var obj = {}, 
    app = Application; 

obj.foo = function() { 
    alert("I'm a foo function!"); 
}; 

obj.bar = "I'm just a property"; 

app.printObj(obj);​ 

DEMO

UPDATE

所以你不應該期待JavaScript這麼多反射工具像Java或C#那樣。 您可以用某種方式模擬這種行爲,但無論如何,您將無法創建特殊的JavaScript對象並調用其不存在的屬性。唯一的辦法是創建一個特殊的功能來實現開關,門面,地圖等 - 任何可以使流動更加動態化的結構。

類似這樣的exmaple

您可以改進此邏輯並根據用戶的操作,傳入數據等動態地添加其他屬性和功能到該app.Stuff。因此,總體而言,您可以使用某種元編程構建智能且靈活的系統JavaScript的。

0

編輯1: 您可以通過使用typeof檢查方法的存在: 如果(!typeof運算(爲obj.methodename)= 「未定義」)如果你想專門檢查{ //調用方法名 } 對於一個函數,它的類型將返回「函數」。然而,我不知道有什麼辦法來獲得函數的簽名,但是如果你的函數能夠很好地處理空值,JavaScript是相當寬容的。

原始答覆 我認爲Ethan Brown有這個權利,因爲所有的Javascript對象基本上都只是名稱 - 值對變量,有時候是函數。嘗試下面的代碼,以提醒任何給定對象的所有屬性和方法的列表:

function obj(prop){ 
    this.prop = prop; 
    this.setProp = function setProp(prop){this.prop = prop}; 
             } 
     var myObj = new obj("something"); 
    myObj.setProp("anything else"); 
var getKeys = function(obj){ 
    var keys = []; 
    for(var key in obj){ 
     keys.push(key); 
    } 
    return keys; 
} 
alert(getKeys(myObj)); 

注意,這是Slashnick在How to list the properties of a JavaScript object使用

+0

對不起,我已經盡力澄清了這個問題,以防萬一您想再次嘗試。 – Brent