簡體   English   中英

動態修改JS對象的行為

[英]Dynamically modify JS Object's behavior

是否有可能在運行時決定應枚舉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中實現此功能...

干杯,曼努埃爾

可以使用ECMAScript 5中的Object.defineProperty來控制枚舉對象的哪些屬性, 當前該方法正進入瀏覽器

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;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM