是否可以在运行时决定应该枚举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中实现这个......
干杯, 曼努埃尔
答案 0 :(得分:1)
可以使用ECMAScript 5 Object.defineProperty中的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;