Я работаю над созданием определения объекта для инкапсуляции нескольких свойств. У меня есть 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;
}
...
}
Опять же, это самый лучший подход для удовлетворения всех требований?
"' JSON.stringify' будет сдирать функции ..." -' make' не является функцией. Это свойство * accessor *, которое * имеет * функции. Тем не менее, мне непонятно, почему вы не просто используете обычное свойство данных для 'make' и используете' this.make' в любом месте, где вы сейчас используете '_make'. (Если у вас есть функции внутри вашего конструктора, которые используют другое 'this', вы можете записать желаемое' this' с помощью 'var that = this' (или аналогичного) и использовать' this.make'.) – apsillers
Возможно, вам захочется посмотреть в [Записи] (https://github.com/facebook/immutable-js/blob/3.3.0/type-definitions/Immutable.d.ts#L1578-L1637) из [Неизменяемый] (http: // facebook.github.io/immutable-js/). –
@ capsillers Не совсем уверен, что именно вы предлагаете. Не возражаете изменить следующую скрипту с вашим предложением: http://jsfiddle.net/xx1qp1e8/1/ – user1491636