Во-первых, я позволил бы конструктор объекта принять параметр
function User(params) {
...
Чтобы разрешить произвольное число аргументов, подлежащих поставке, параметр params
принимает литерал объекта:
new User({name: 'name 1', id: 1});
Далее Я передаю объект params
на общую функцию, которая будет обрабатывать назначение свойств объекта params
для target
объект.
function setObjectProperties(params, target) {
}
setObjectProperties
функция должна убедиться, что мы правильно прошли какие-то данные. Он проверяет, как params
и target
определены:
function setObjectProperties(params, target) {
if (params !== undefined && target !== undefined) {
}
}
После того, как мы уверены, что у нас есть что-то для работы, настало время, чтобы перебирать параметры и присвоить свойство объекта.
function setObjectProperties(params, target) {
if (params !== undefined && target !== undefined) {
$.each(params, function (i, property) {
this[i] = property;
}, target);
}
}
Используя $.each
функции JQuery, которая итерацию над объектами свойствами без побочного эффекта перебора всех свойств объекта, таких как прототипы, и т.д.Это работает, но означает, что нам нужно иметь дело с побочным эффектом, который this
получает переопределенную внутреннюю часть функции обратного вызова функции $.each
. Теперь мы больше не знаем, что такое оригинальный объект.
Однако $.proxy
функция JQuery разработана, чтобы позволить нам вызвать функцию в то время как определять, что мы хотели бы использовать в качестве this
:
function setObjectProperties(params, target) {
if (params !== undefined && target !== undefined) {
$.each(params, $.proxy(function (key, value) {
this[key] = value;
}, target));
}
}
Здесь мы говорим, JQuery, чтобы установить this
к значению целевого параметра , который установлен в this
внутри конструктора объекта, как показано ниже:
function User(params) {
this.name = null;
this.email = null;
this.password = null;
setObjectProperties(params, this);
}
Одна проблема все еще остается, мы должны проверить против заявленных свойств на объекте, чтобы увидеть, если мы можем присвоить значение, переданное в:
function setObjectProperties(params, target) {
if (params !== undefined && target !== undefined) {
$.each(params, $.proxy(function (key, value) {
if (this.hasOwnProperty(key)) {
this[key] = value;
}
}, target));
}
}
Вот полный и окончательный код:
function setObjectProperties(params, target) {
if (params !== undefined && target !== undefined) {
$.each(params, $.proxy(function (key, value) {
if (this.hasOwnProperty(key)) {
this[key] = value;
}
}, target));
}
}
function User(params) {
this.name = null;
this.email = null;
this.password = null;
setObjectProperties(params, this);
}
user1 = new User();
// User { name: null, email: null, password: null }
user2 = new User({ name: 'First Last' });
// User { name: "First Last", email: null, password: null }
user3 = new User({ name: 'First Last', age: '400' });
// User { name: "First Last", email: null, password: null }
Решение не должно присваивать свойства, которые не были определены на объекте. Объект должен определить его свойства и не должен устанавливать свойства по параметру, который не был определен. Достигает ли это решение? – michaelward82
@ michaelward82 - почему это важно? Переменные могут ** только ** получить доступ через объект 'options', чтобы они не переписывали что-либо еще в функции. Кроме того, почему вы все равно пропускаете ненужные переменные? – Joe
@ michaelward82 - Я обновил свой ответ альтернативой, если вы не хотите добавлять дополнительные свойства, переданные функции, - не нужно jQuery. – Joe