Несколько параметров для функции Set.defineProperty Setter?
Можно ли иметь несколько параметров для функции установки Object.defineProperty?
НАПРИМЕР
var Obj = function() {
var obj = {};
var _joe = 17;
Object.defineProperty(obj, "joe", {
get: function() { return _joe; },
set: function(newJoe, y) {
if (y) _joe = newJoe;
}
});
return obj;
}
Я не получаю никаких ошибок из синтаксиса, но я не могу понять, как вызвать функцию setter и передать ей два аргумента.
3 ответа
Можно ли иметь несколько параметров для функции установки Object.defineProperty?
Да, но их невозможно вызвать (кроме Object.getOwnPropertyDescriptor(obj, "joe").set(null, false)
). Сеттер вызывается с одним значением, назначенным свойству (obj.joe = "doe";
) - вы не можете назначить несколько значений одновременно.
Если они вам действительно нужны (по каким-либо причинам), лучше использовать базовый метод установки (obj.setJoe(null, false)
).
У меня была похожая дилемма с методом установки, поэтому я закончил с параметром объекта (синтаксис ES6):
set size(param) {
this.width = param.width;
this.height = param.height;
}
И я использую это как:
this.size = {width: 800, height: 600};
Просто интересная мысль.
var Joe = (function() {
// constructor
var JoeCtor = function() {
if (!(this instanceof Joe)){
throw new Error('Error: Use the `new` keyword when implementing a constructor function');
}
var _age = 17;
// getter / setter for age
Object.defineProperty(this, "age", {
get: function() { return _age; },
set: function(joeObj) {
if (joeObj.assert) {
_age = joeObj.value;
}
}
});
};
// static
JoeCtor.ageUpdateRequest = function(canSet, newAge){
return { assert: canSet, value: newAge }
};
return JoeCtor;
})();
myJoe = new Joe();
myJoe.age = Joe.ageUpdateRequest(true, 18);