2016-02-10 25 views
0

我是javascript新手。我有一个功能取物体。但是,我如何确保调用者在对象中遵循我想要的结构。由于JavaScript中没有类的概念,我无法创建模型类并使调用者使用它?在函数参数中强制对象结构

function foo(myObject) 
{ 

} 

谁在呼唤应该给我

{ 
    Count, 
    [ 
    { 
     FirstName, 
     LastName 
    }, 
    { 
     FirstName, 
     LastName 
    }, 
    ] 
} 
+0

Javascript实际上并不像这样工作。您可以验证对象(请参阅下面的答案),但类型不像在C#等类型安全的语言中那样工作。最终,这是因为Javascript不是一种编译语言。 – Liam

+0

会打字稿解决这个问题吗? – tatmanblue

回答

2

那么你可以简单地检查你收到作为参数对象的类型,然后检查这些值实际上有,像这样:

function foo(myObject) { 
    if (typeof myObject !== 'object') { 
     // doesn't match 
     return; 
    } 
    if (typeof myObject.Count === 'undefined') { 
     // no count property 
    } 
} 

但是,从你的问题,看来你想使该类型的对象应该作为一个参数发送更多的修正,而这也可以做在JavaScript中,做了如:

function MyParamOptions() { 
    // define properties here 
    this.persons = []; 
    Object.defineProperty(this, 'Count', { 
     get: function() { 
      return this.Names.length; 
     }, 
     set: function() { 
      // dummy readonly 
     } 
    }); 
} 

然后,你可以说

var options = new MyParamOptions(); 
options.persons.push({ firstName: 'bla', lastName: 'bla' }); 

实例化这个类的一个实例,并更改检查您的富功能里面像

function foo(myObject) { 
    if (myObject instanceof MyParamOptions) { 
     // here myObject is MyParamOptions, so you can access the persons array, the Count property etc... 
    } 
} 

// and call foo with your MyParamOptions 
foo(options); 

然而,这不会抛出编译任何警告时间,所以人们可以用任何参数调用你的函数。如果您在编译时查找错误,您可能会考虑使用TypeScript或类似技术,然后将您的TypeScript代码转换为javascript)