【问题标题】:Best approach for creating an object from deserializing从反序列化创建对象的最佳方法
【发布时间】:2014-03-02 00:54:13
【问题描述】:

从反序列化创建对象的最佳方法。

我正在寻找从序列化数据创建对象的好方法。让我们假设有一个这样定义的对象:

function A()
{}
A.prototype.a = "";

和序列化数据:“a”。 那么哪种方法会更好,为什么:

1。创建静态方法反序列化:

    A.deserialize = function( data )
    {
        var a = new A();
        a.a = data;
        return a;
    }

并且会这样调用:

var a = A.deserialize("a");

2。在原型中创建方法

A.prototype.deserialize = function ( data )
{
    this.a = data;
}

它会被这样调用

 var a = new A();
 a.deserialize( "a" );

3。在构造函数中处理数据

function A(data) 
{ 
   this.a = data; 
}

考虑到数据可以是不同的类型,例如字符串、json 或 ArrayBuffer。 我正在寻找更通用的解决方案。我将如何创建对象有什么问题吗?

【问题讨论】:

    标签: javascript


    【解决方案1】:

    我写了这个jquery函数,可以很容易地序列化任何表单数据。

    $.fn.serializeObject = function () {
        var result = {};
        this.each(function () {
            var this_id = (this.id.substring(this.id.length - 2) == '_s') ? this.id.substring(0, this.id.length - 2) : this.id.replace('_val', '');
            if (this.type == 'radio') {
                var this_id = this.name;
                result[this_id.toLowerCase()] = $('input[name=' + this_id + ']:checked').val();
            }
            else if (this.type == 'checkbox') {         
                result[this_id.toLowerCase()] = $('#' + this_id).prop('checked');
            }
            else {          
                if (this_id.indexOf('___') > -1) {
                    this_id = this_id.substring(0, this_id.indexOf('___'));
                }
                result[this_id.toLowerCase()] = this.value;
    
            }
        });
        return result;
    };
    

    您可以通过 var form_vars = $('#div input, #div select, #div textarea').serializeForm() 轻松调用它

    你可以通过 form_vars.property = 'value'; 给对象添加额外的属性,你甚至可以给它添加 js 数组和 json 对象。那么就可以使用 $.ajax 来提交了。

    【讨论】:

    • 确实是这样,使用我的方法,您可以通过执行“object_name.property”从对象中获取任何值,而无需使用函数从对象中获取数据。我相信这就是您要征求意见的原因。
    • 对不起,但这与我的问题无关。也许我的英语不好。假设我没有使用 JQuery,并且该对象与 html 元素无关。假设数据是通过 webSocket 作为 arraybuffer 接收的,并且与 html 没有直接关系。我熟悉JS,jq等。我不是在寻找确切的代码,而是寻找方法。我正在寻找可能与不同方法相关的优缺点和问题。
    【解决方案2】:

    您可以使用通用解决方案将其他对象(反)序列化为 JSON,并从中制作实用功能。更多信息请访问How to serialize & deserialize Javascript objects?

    如果您更喜欢单独反序列化每个对象类型。

    静态方法方法

    优点:

    • 静态方法可以干净地处理整个对象的创建和设置值,而不是创建任何不必要的临时对象等。迄今为止最清洁的解决方案。
    • 此方法不需要对象知道序列化过程,并且可以轻松添加到现有解决方案中

    原型法方法

    缺点:

    • 此变体污染原型链。
    • 你必须为了创建一个对象而创建一个对象,除非你想用它来从内部填充它。如果构造函数中存在需要执行的实例逻辑,则可能会出现问题。

    在构造函数中处理数据

    缺点:

    • 构造函数需要重载。如果传递给构造函数的数据是普通数据或序列化数据,则可能难以识别。例如通常它需要一些字符串,序列化的数据也是字符串。

    【讨论】:

      猜你喜欢
      • 2011-09-23
      • 2011-07-09
      • 1970-01-01
      • 1970-01-01
      • 2013-04-24
      • 2021-10-24
      • 2013-01-22
      • 1970-01-01
      • 2010-12-30
      相关资源
      最近更新 更多