有没有办法将方法添加到JSON对象?
答案 0 :(得分:13)
是。 Javascript函数是第一类对象,这意味着您可以将它们作为属性附加到其他对象。
var myJson = { one: 1, two: 2 };
myJson.Sum = function() { return this.one + this.two; };
var result = myJson.Sum(); // result == 3
答案 1 :(得分:1)
这完全取决于你如何使用它。
通过使用Tomas的函数,您实际存储了EACH对象的Sum,也可以附加它。
如果在插入对象之前将函数保存在其他位置,则会使用较少的内存。
糟糕的一个:
var array = [];
for (i=0; i<100000; i++)
array[i] = { test: function(){ "A pretty long string" }; }
好的一个:
var array = [],
long = function(){ "A pretty long string"; };
for (i=0; i<100000; i++)
array[i] = { test: long }
在我的测试中,好的一个额外需要大约3mb,坏的一个需要大约20mb。这是因为您只存储了100000个函数的引用,而不是100000个匿名函数。
您在评论中提到的方法(基于原型的方法)可以编码为:
function wrapper(data){
for (i in data)
this[i] = data[i]; // This is a fast hack
// You will probably want to clone the object, making sure nested objects and array
// got cloned too. In this way, nested objects and array will only get their
// reference copied inside this
}
wrapper.prototype.test = function(){
"A pretty long string";
}
var array = [];
for (i=0; i<100000; i++)
array[i] = new wrapper({})
内存方式与我之前编写的Good大致相同,但具有不使用函数名称(在示例中为test)污染对象的优点。
缺点主要在于长度,复制数据的需要以及用于复制的“黑客”(在某些设计中可能有效,在其他设计中可能非常糟糕)。
答案 2 :(得分:0)
是的,它就像任何其他对象一样:
从Chrome控制台:
> JSON.myMethod = function(x) { console.log(x); }
function (x) { console.log(x); }
> JSON.myMethod("hello")
hello
undefined
答案 3 :(得分:0)
很简单......
var FillCbo =JSON.parse( '{"Category":""}');
FillCbo.Category = CboCategory;
Now Method Implimentation
function CboCategory(PCboName)
{
Alert(PCboName);
}
现在,您可以在页面
中的任何位置使用FillCbo.Category()作为方法FillCbo.Category("How Are Youu...");