代码之家  ›  专栏  ›  技术社区  ›  uzay95

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

  •  5
  • uzay95  · 技术社区  · 14 年前

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

    4 回复  |  直到 14 年前
        1
  •  13
  •   Tomas Aschan    14 年前

    对。javascript函数是一类对象,这意味着您可以将它们作为属性附加到其他对象。

    var myJson = { one: 1, two: 2 };
    
    myJson.Sum = function() { return this.one + this.two; };
    
    var result = myJson.Sum(); // result == 3
    
        2
  •  1
  •   framp    12 年前

    这完全取决于你如何使用它。

    通过使用tomas的函数,您可以实际存储每个附加对象的总和。

    如果在插入对象之前将函数保存在其他地方,则将使用较少的内存。

    坏消息:

    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({})
    

    内存方面与我之前写的大致相同,但它的优点是不会用函数名污染我们的对象(示例中是test)。

    缺点主要是长度,需要复制我们的数据和用于复制的“黑客”(这可能在某些设计中有效,在其他设计中完全糟糕)。

        3
  •  0
  •   Moxen    11 年前

    是的,它和其他物体一样:

    从Chrome控制台:

    > JSON.myMethod = function(x) { console.log(x); }
    function (x) { console.log(x); }
    > JSON.myMethod("hello")
    hello
    undefined
    
        4
  •  0
  •   Shujaat Abdi    8 年前

    很简单……

    var FillCbo =JSON.parse( '{"Category":""}');
    FillCbo.Category = CboCategory;
    

    Now方法实现

    function CboCategory(PCboName)
    {
        Alert(PCboName);
    }
    

    现在您可以使用fillcbo.category()作为页面中任何地方的方法

    FillCbo.Category("How Are Youu...");