动态修改JS Object的行为

时间:2010-10-03 16:56:31

标签: javascript properties

是否可以在运行时决定应该枚举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 个答案:

答案 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;