gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-28 00:51:13 25 4
gpt4 key购买 nike

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

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

如何用 JS 设计类?

最佳答案

有多种方法可以完成您想要的事情。使用 underscorejs/jquery 扩展等实用程序以及 underscore 的一些实用方法(map、reduce 等),必需/可选非常容易。

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

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

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

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

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 分钟就把它拼凑起来),但它应该是一个好的开始。我也不会允许访问私有(private)存储。

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

关于Javascript 类 - 如何使属性成为必需和可选,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26749790/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com