【问题标题】:Javascript class - how to make properties required and optionalJavascript 类 - 如何使属性成为必需和可选
【发布时间】:2014-11-05 04:38:26
【问题描述】:

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

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

如何在 JS 中设计类?

【问题讨论】:

    标签: javascript function object


    【解决方案1】:

    有很多方法可以做你想做的事情。使用 underscorejs/jquery extend 之类的实用程序以及一些 underscore 的实用程序方法(map、reduce 等),必需/可选项非常容易。

    要防止对象实际上具有其他属性虽然有点棘手。您可以运行一组已知的必需/可选属性作为检查,并对任何不符合您的条件的属性值执行delete

    另一种选择是使用密封件之类的东西。您可以在 mozilla 的网站 here 上阅读更多相关信息。

    所以我想我要做的是首先通过对它们的存在进行健全性检查来获得所需的属性。您可以使用扩展来提供和包装/解包您的选项。

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

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

    >>> 编辑

    这可能并不完美,但这是我迄今为止为可选/必需属性所做的。我显然假设他们只是在构造函数中传递一组属性。

        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 分钟内将它拼凑在一起),但这应该是一个好的开始。我也只是不允许访问私人存储。

    当我准备好实际提取属性时(比如当你准备好序列化时),我会做一些类似于在构造函数中所做的事情 - 只需手动完成并获取你真正想要的东西 - 一切else 会以这种方式被丢弃。事实上,去掉可选/必需的逻辑并将它们作为对象原型上的方法可能是有意义的(例如EventTrackerAPI.prototype.extractRequired = function( required ) {.... }...)

    【讨论】:

    • 谢谢.. 不幸的是,我没有依赖外部库的奢侈。需要纯javascript。
    • underscore 在 github 上提供了他们的源代码。出于与您完全相同的原因,我不得不不时地自己采取一种或两种方法。它有点工作,但值得获得一些功能。只是一个想法;)
    • 现在你让我对这个更加好奇了。我可能会尝试写一些东西来做你所说的。如果我能在明天之前得到它,我会发布一个 github 链接作为跟进(也就是说,如果你没有找到你想要的答案)。
    • 感谢 Jonathon,将密切注意处理此问题的方法。
    • 查看我的编辑。希望能让你走上正轨。
    【解决方案2】:

    为什么不只使用带有构造函数的类 - 你将拥有所需的属性

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-06-27
      • 1970-01-01
      • 1970-01-01
      • 2018-12-02
      • 1970-01-01
      • 2013-12-27
      • 1970-01-01
      相关资源
      最近更新 更多