2

Я работаю над созданием определения объекта для инкапсуляции нескольких свойств. У меня есть 4 требования для этого объекта:javascript object w/getter and setter

  • более чем один экземпляр может быть создан в любой момент
  • только свойства, определенные в объекте можно установить/получить
  • объект должен быть stringify-состоянии (только свойства и связанные с ними значения)
  • строковой версия должна разобрать-состоянии и вернуть объект

Это упрощенная версия того, что я до сих пор:

function Car() { 

    var _make; 

    Object.defineProperty(this, 'make', { 
     get: function() { 
      return _make; 
     }, 
     set: function(make) { 
      _make = make;   
     } 
    }); 
    Object.preventExtensions(this); 
} 

Я не уверен, что это самый простой способ определения объекта с помощью геттеров и сеттеров. Есть ли альтернатива использованию defineProperty, или это новая норма?

Этот подход также требует, чтобы я написал свой собственный метод stringify (см. Ниже), поскольку вызов JSON.stringify отключит функции, и это отключит make. Есть ли альтернатива написанию моего? Могу ли я каким-либо образом изменить определение объекта?

Car.prototype.stringify = function() { 
    return JSON.stringify({ make: this.make}); 
} 

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

function Car(car) { 
    var _make; 
    if(car !== undefined && car != null) { 
     _make = car.make; 
    } 
    ... 
} 

Опять же, это самый лучший подход для удовлетворения всех требований?

+2

"' JSON.stringify' будет сдирать функции ..." -' make' не является функцией. Это свойство * accessor *, которое * имеет * функции. Тем не менее, мне непонятно, почему вы не просто используете обычное свойство данных для 'make' и используете' this.make' в любом месте, где вы сейчас используете '_make'. (Если у вас есть функции внутри вашего конструктора, которые используют другое 'this', вы можете записать желаемое' this' с помощью 'var that = this' (или аналогичного) и использовать' this.make'.) – apsillers

+0

Возможно, вам захочется посмотреть в [Записи] (https://github.com/facebook/immutable-js/blob/3.3.0/type-definitions/Immutable.d.ts#L1578-L1637) из [Неизменяемый] (http: // facebook.github.io/immutable-js/). –

+0

@ capsillers Не совсем уверен, что именно вы предлагаете. Не возражаете изменить следующую скрипту с вашим предложением: http://jsfiddle.net/xx1qp1e8/1/ – user1491636

ответ

3

Чтобы показать make свойства при использовании JSON.stringify, вы должны установить enumerable в Правда (По умолчанию Ложный).

конфигурируемый: true тогда и только тогда, когда тип этого дескриптора свойств может быть изменено, и если свойство может быть удален из соответствующего объекта. По умолчанию false.

Перечислимый: true тогда и только тогда, когда это свойство появляется при перечислении свойств соответствующего объекта. По умолчанию false. функция Car() {

var _make; 

Object.defineProperty(this, 'make', { 
    get: function() { 
     return _make; 
    }, 
    set: function(make) { 
     _make = make;   
    }, 
    enumerable:true 
}); 
Object.preventExtensions(this); 

}