我正在构建一个跟踪api的事件,并且需要为JS类提供一个属性列表,其中一些属性将是必需的,一些是可选的。此外,不应添加新属性。
一旦客户端基于类实例化并传递对象,我将序列化对象并将其作为查询字符串发送。我已经有了这部分,但不知道如何限制客户端创建新属性。
如何在JS中设计类?
答案 0 :(得分:0)
有很多方法可以做你想要的事情。使用underscorejs / jquery扩展等实用程序以及一些下划线的实用程序方法(map,reduce等),必需/ Optionals非常简单。
防止对象实际拥有其他属性虽然有点棘手。您可以运行一系列已知的必需/可选属性作为支票,并对不符合您条件的任何属性值执行delete
。
另一个选择是使用密封之类的东西。您在mozilla的网站here上阅读了有关此内容的更多信息。
所以我想我要做的就是首先通过对其存在进行健全性检查来获得所需的属性。您可以使用extend提供和包装/解包您的选项。
最后(也许是更好的路线)是强制用户调用getter / setter方法,如setMyProperty( 'value' )
,以填充任何必需/可选属性值。这样,您就不必使用上述工具编写大型解决方案。
JS就是那么有趣。这两种方案都不是完美的,但它们都是可能的解决方案。我确定还有其他人。这只是JS的一部分,可能在arsonal中有点痛苦。祝你好运。
<强>&GT;&GT;&GT;修改&lt;&lt;&lt;&lt;
这可能并不完美,但这是我迄今为止对可选/必需属性所做的工作。我显然假设他们只是在构造函数中传递一组属性。
var _Required = {
requiredProperty1: null,
requiredProperty2: null,
requiredProperty3: null
};
var _Optionals = {
optionalProperty1: null,
optionalProperty2: null,
optionalProperty3: null
};
var EventTrackerAPI = function( settings ) {
var requiredProp, optionalProp;
this.required = {};
this.optional = {};
for( requiredProp in _Required ) {
if( !settings.hasOwnProperty( requiredProp ) ) {
throw new Error( 'FAILED to create an instance of EventTrackerAPI - Required Property (' + requiredProp + ') Missing!' )
}
this.required[requiredProp] = settings[requiredProp];
}
for( optionalProp in _Optionals ) {
if( settings.hasOwnProperty( optionalProp ) ) {
this.optional[optionalProp] = settings.hasOwnProperty( optionalProp );
} else {
this.optional[optionalProp] = null;
}
}
};
无论如何,我可能会做类似上面的事情。它不是完美的(因为我在大约10分钟内把它扔在一起),但它应该是一个好的开始。我也不允许访问私人存储。
当我准备好实际提取属性时(比如当你准备序列化时),我做了类似于构造函数中所做的事情 - 只需手动完成并抓住你的东西实际上想要 - 其他一切都会以这种方式被抛弃。事实上,删除可选/必需的逻辑并在对象的原型(例如EventTrackerAPI.prototype.extractRequired = function( required ) {.... }
上)制作方法可能是有意义的。)