Динамически изменять поведение объекта JS - PullRequest
0 голосов
/ 03 октября 2010

можно ли во время выполнения решить, какие свойства объекта 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` 

Извините, я посмотрел QScriptEngine в Qt, где вы можете делать подобные вещи, но я не знаю, как реализовать это в нативном JS ...

Ура, Мануэль

1 Ответ

1 голос
/ 03 октября 2010

Можно контролировать, какие свойства объекта перечисляются, используя Object.defineProperty в ECMAScript 5, , который в настоящее время пробивается в браузеры :

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;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...