2014-11-05 3 views
0

Я создаю отслеживание событий api и вам необходимо предоставить класс JS со списком свойств, из которых некоторые из них потребуются и некоторые необязательные. Кроме того, новые свойства не должны добавляться.Класс Javascript - как сделать необходимые свойства и необязательные

Как только клиент создает экземпляр объекта и передает его на основе класса, я буду сериализовать объект и отправить его в виде строки запроса. У меня уже есть эта часть, но я не уверен, как ограничить клиенту создание новых свойств.

Как мне заняться проектированием класса в JS?

+0

'Object.freeze()'? –

ответ

0

Существует множество способов делать то, что вы хотите. Обязательные/необязательные параметры довольно просты с помощью утилит, таких как 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) {.... } ...)

+0

Спасибо .. к сожалению, у меня нет роскоши полагаться на внешние библиотеки. Нужно быть чистым javascript. – user2727704

+0

Подчеркивание обеспечивает их источник на github. Мне приходилось время от времени вырывать один или два метода по той же причине, что и у вас. его немного работы, но стоит того, чтобы получить некоторые функции.просто мысль;) –

+0

теперь ты меня немного заинтересовал. я могу попытаться написать что-то, чтобы сделать то, о чем вы говорите. если я получу его завтра, я отправлю ссылку github в качестве последующего действия (то есть, если вы не найдете ответ, который вы первый раз). –