有没有办法向JSON对象添加方法?

时间:2010-07-29 07:10:09

标签: json extension-methods

有没有办法将方法添加到JSON对象?

4 个答案:

答案 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...");