2010-10-03 40 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;