2012-06-30 33 views
1

JavaScript相对较新,所以想知道达到以下要求的最佳方法是什么。 我想创建JSON对象(RPC请求对象),并且需要强制执行一些结构。就我所知,JS是动态语言,因此我可以随时将任何类型添加到对象中。但是,我喜欢定义一个类,我可以填充它来构造JSON请求。用于实施JSON结构的Javascript类

var RecReq = { 
      ID:{}, 
      HeaderLevel:{}, 
      Content:{} //Content object goes here 
     }, 
     HeaderLevel = { 
      HeaderID:{}, 
      Note:{} 
     }, 
     Content = { 
      Item: [] //Array of Item goes here 
     }, 
     Item = { 
      IDs:[] 
     }; 

    function ReceiveObj() { 
     this.RecReq = RecReq, 
      this.HeaderLevel = HeaderLevel, 
      this.Content = Content, 
      this.Item = Item 
    }; 
    return new ReceiveObj(); 

我相信很多上面的代码有问题。我不认为该对象是在初始化数组的情况下创建的。 在返回的对象上,我无法执行push()操作以将内容插入内容。

你会如何处理这个问题。您是否即时创建对象,或者更好地定义强制某种结构的对象。

+1

我不会为JSON DTO创建一个JS类。通常情况下,您将DTO发送到某个Web服务;如果服务是以静态类型语言实现的,那就让它处理类型安全。另一种更适合动态语言的方法是使用单元测试来验证代码生成的对象的结构。 – millimoose

+0

感谢您分享您的经验。我不会创建一个类,但可以即时构建一个对象。我的意图只是向DOCUMENT所有对象“可以”包含,因此它不会在后端引发错误。为了帮助我学习,能否请你建议我应该如何构建DTO(用惯用的JS方式)。它应该全部在一个班级还是我试图做的方式(不同的变量指示班级中的不同字段/类型)。这感觉非常糟糕,所以一个例子会帮助我思考JS方式。再次感谢 – bsr

+1

要记录事情,你可以使用服务器端定义 - 如果端点是使用.NET和WCF实现的,那么这将是数据契约。 (如果服务不是某种公共API,这是一个很好的选择。)否则,您可以查看使用“选项散列”模式的主要Javascript库是如何记录的;通常,这意味着“描述实际用例的大量例子”。所以我会说你只是提供你的服务所期望的JSON的完整例子,然后记录这些属性的目的就不会出错。 – millimoose

回答

1

如果你的代码表明你希望你的实例继承外部对象,那么一种方法是分配'class'的原型(注意在JS中用class来表达思想 - 它不是一个类Java等)的意义。

var obj = { 
    prop_1: 'foo', 
    prop_1: 'bar' 
} 
function Something() { 
    alert(this.prop_1); //alerts "foo" 
} 
Something.prototype = obj; 
var something = new Something(); 

这只是一种方式。有很多控制继承的模式(以及其他模式,即使没有接近继承的概念,也能实现你想要的)。

至于push()不工作,在代码中,Content是一个对象,而push()Array原型的方法。换句话说,你只能将push()转换成一个数组。也许你的意思是Content.Item,这是一个数组。

最后,我会避免大写名字。在JavaScript中,这往往只能用于类模拟中使用的函数(如ReceiveObj),以表示它们应该被实例化,而不仅仅是被调用。

+0

感谢您的帮助。目的不是继承外部对象,而是指定ReceiveObj。内容是类型的(因此可以设置字段)内容。我知道它不能在JS中强制执行,因为有人可以随时更改类型,但它仍然可以是一个指示器,以记录ReceiveObj包含的所有字段。关于推送,我想调用recObj.Content.push(anItem)。我认为在我的定义中,数组没有初始化。你是对的,我正在考虑通过其他OOP语言。 – bsr

+0

问题是你的'Content'属性是一个对象,而不是一个数组,因此它没有'push()'方法。数组是Content.Items而不是Content。在JavaScript中,初始化和声明是一步,而不是两步,所以一旦你声明了你的数组就可以使用了。任何默认值(即'初始化')值都是您在创建时填充的值(在您的情况下,无)。 – Utkanos