Вы можете определить пользовательскую функцию для вашего объекта с именем toJSON()
, которая возвращает только те элементы объекта, которые вы хотите.В некоторой степени нелогично, ваша toJSON
функция должна не возвращать строку JSON - она просто возвращает объект, представляющий то, что следует использовать в качестве ввода для JSON.stringify
.
Например:
// an object with some attributes you want and some you don't
var o = {
a:"value1",
b:"value2",
doCalc: function() { return this.a + " " + this.b }
};
// define a custom toJSON() method
o.toJSON = function() {
return {
a:this.a,
calc: this.doCalc()
}
};
JSON.stringify(o); // '{"a":"value","calc":"value1 value2"}'
В вашем случае вы сможете определить этот метод для gContextMenu
на лету, прежде чем вызывать JSON.stringify
.Это требует от вас явного определения того, что вы хотите и не хотите, но я не думаю, что есть лучший способ.
Редактировать: Если вы хотите использовать все не-методызначения, вы можете попробовать что-то вроде этого:
o.toJSON = function() {
var attrs = {};
for (var attr in this) {
if (typeof this[attr] != "function") {
attrs[attr] = String(this[attr]); // force to string
}
}
return attrs;
};
Возможно, вы получите несколько атрибутов с "[object Object]"
, но если все, что вам нужно, это проверка, это, вероятно, не проблема.Вы также можете попробовать проверить typeof this[attr] == "string" || typeof this[attr] == "number"
, если хотите получить только эти типы атрибутов.