2010-10-03 67 views
0

是否可以在運行時決定枚舉JS對象的哪些屬性?動態修改JS對象的行爲

喜歡的東西

myobj = {}; 
myobj.keys = function() { // I made this keys function up. Is there something like that in JS? 
    if ((new Date).getSeconds() < 30) 
    return [1,2,3]; 
    else 
    return [4,5,6]; 
} 

for(p in myobj) 
    console.log(p); // returns either 1,2,3 or 4,5,6 

此外,是否有可能調用一個函數,如果一個對象的屬性不存在? 喜歡的東西

myobj.fallbackFunction = function(arg) { return arg; }; 
console.log(myobj['nonexisting-property']); // returns the string 'nonexisting-property' 

我的最後一個問題: 是否可以調用一個對象作爲函數? 像

myobj.call = function(arg) { console.log(arg) }; 
myobj(123) // returns 123` 

對不起,我看了一下Qt的複製代碼QScriptEngine哪裏可以做類似的東西,但我不知道如何在本地JS實現這個...

乾杯, 曼努埃爾

回答

1

它可能控制的對象的屬性是使用Object.defineProperty列舉的ECMAScript 5,which is currently making its way into browsers

var o = { "foo": 1, "bar": 2 }; 

for (var i in o) { console.log(i); } // Logs "foo" and "bar"; 

Object.defineProperty(o, "foo", { enumerable: false }); 

for (var i in o) { console.log(i); } // Logs just "bar"; 

對於下一部分,如果對象的屬性未定義,則沒有標準或跨瀏覽器的方式來調用方法。

最後,你不能讓任何舊對象作爲一個函數被調用,但是你可以首先定義你的變量作爲一個函數,它將具有對象的所有常用特徵,因爲函數本身就是對象(Function.prototype繼承自Object.prototype)。例如,您可以將屬性分配給函數:

var f = function() { alert("Hello"); }; 
f.myProp = 1;