Существует множество способов делать то, что вы хотите. Обязательные/необязательные параметры довольно просты с помощью утилит, таких как 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 минут), но это должно быть хорошим началом. Я бы также просто не разрешал доступ к частному хранилищу.
Когда я был готов на самом деле извлекать свойства (например, когда вы готовы к сериализации), я бы сделал что-то подобное, как это делается в конструкторе - просто вручную перейдите и захватите то, что вы на самом деле хотите - все остальное просто будет отброшено таким образом. На самом деле, может быть целесообразно исключить необязательную/требуемую логику и сделать их методами на прототипе объекта (например, EventTrackerAPI.prototype.extractRequired = function(required) {.... }
...)
'Object.freeze()'? –