Javascript类-如何使属性成为必需的和可选的

Javascript类-如何使属性成为必需的和可选的,javascript,function,object,Javascript,Function,Object,我正在构建一个事件跟踪api,需要为JS类提供一个属性列表,其中一些属性是必需的,一些是可选的。此外,不应添加新属性 一旦客户机基于类实例化并传递对象,我将序列化对象并将其作为查询字符串发送。我已经有了这个部分,但不确定如何限制客户端创建新属性 如何在JS中设计类?有很多方法可以满足您的需求。Required/Optionals与诸如下划线JS/jquery extend之类的实用程序以及一些下划线的实用程序方法(map、reduce等)配合使用非常简单 但是,要防止对象实际具有附加属性就有点棘

我正在构建一个事件跟踪api,需要为JS类提供一个属性列表,其中一些属性是必需的,一些是可选的。此外,不应添加新属性

一旦客户机基于类实例化并传递对象,我将序列化对象并将其作为查询字符串发送。我已经有了这个部分,但不确定如何限制客户端创建新属性


如何在JS中设计类?

有很多方法可以满足您的需求。Required/Optionals与诸如下划线JS/jquery extend之类的实用程序以及一些下划线的实用程序方法(map、reduce等)配合使用非常简单

但是,要防止对象实际具有附加属性就有点棘手了。您可以运行已知必需/可选属性的数组作为检查,并对任何与您的条件不匹配的属性值执行
delete

另一种选择是使用类似密封的东西。你可以在mozilla的网站上读到更多关于这方面的信息

所以我想我要做的是首先通过对所需属性的存在性进行健全性检查,使其工作。可以使用extend来提供和包装/打开您的选项

最后(也许是更好的方法)是强制用户调用getter/setter方法,如
setMyProperty('value')
,以填充任何必需/可选的属性值。这样,您就不必使用上面的工具编写一个复杂的解决方案

JS就是这么有趣。两种解决方案都不是完美的,但它们都是可能的解决方案。我肯定还有其他人。这只是JS的一部分,可能是纵火案中的一点痛苦。祝你好运


>>编辑谢谢。。不幸的是,我没有依赖外部库的奢侈。需要纯javascript。下划线在github上提供了它们的源代码。我自己也不得不时不时地抓取一两种方法,原因和你完全一样。这需要做一些工作,但获得一些功能是值得的。只是一个想法;)现在你让我对这更好奇了。我可以试着写点东西来做你所说的。如果我能在明天之前得到它,我会发布一个github链接作为后续(也就是说,如果你没有找到你首先要找的答案)。谢谢Jonathon,我会留意如何处理这个问题。请查看我的编辑。希望能让你走上正轨。
    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;
            }
        }
    };