Как я могу спасти неопределенное свойство объекта в JavaScript?

Хорошо, скажем, у вас есть два объекта: greg а также stacy, Они оба люди. Объект Грега выглядит так:

var greg = {
  name: "Greg",
  job: "doctor",
  age: 45
}

и Стейси вот так:

var stacy = {
  name: "Stacy",
  age: 42
}

Когда кто-то пытается получить доступ к Стейси job собственность, как я могу получить это возвращение "Безработный", не называя это job? Мне бы хотелось решение, которое не использует прототипы, и я бы предпочел не использовать функцию для доступа ко всем свойствам объекта.

Просто для контекста: я использую это для системы автоматической загрузки Ajax, аналогичной серверной стороне Rails.

4 ответа

Решение

Использование || указать значение по умолчанию при извлечении свойства.

var job = person.job || "Unemployed";

Тем не менее, это должно быть сделано в любом месте, где вы получаете работу. Если вы не хотите повторять это повсеместно, вам нужно использовать функцию или прототип.

Я бы использовал такой код... используя конструктор со значениями по умолчанию:

function Person(cfg) {
  this.name = cfg.name || "John Q. Public";
  this.job = cfg.job || "Unemployed";
  // EDIT: This will allow for an age of '0' -- a newborn.
  this.age = typeof cfg.age === undefined ? null : cfg.age;
}

var greg = new Person({
  name: "Greg",
  job: "doctor",
  age: 45
});

var stacy = new Person({
  name: "Stacy",
  age: 42
});

console.log(stacy.job);

Вы можете использовать явные проверки с typeof:

if (typeof obj.job === "undefined") { ..

или проще:

console.log(obj.job || "Unemployed")

Неправильная архитектура!

function Person(name, job, age) {
    this.name = name ? name : "no name";
    this.job = job ? job : "no job";
    this.age = age ? age : -1:
}
var greg = new Person("Greg", "doctor", 45);
var stacy = new Person("Stacy", null, 42);

console.log(stacy.job);

Или вы планировали написать собственный статический класс для каждого человека???

Другие вопросы по тегам