Конструктор класса JS

361
29 марта 2018, 10:32

class Product { 
    constructor(name, price) { 
        this.productName = name || 'No Name'; 
        this.price = price || 0; 
    } 
    getInfo() { 
        return `${this.productName} ${this.price}`; 
    } 
}

Мой вопрос: как мне создать объект класса Product с названием по умолчанию и заданной ценой? т.е. const prod = new Product( 742); мне нужно, чтобы конструктор понимал, что 742 - это price.

Answer 1

class Product { 
    constructor(data) { 
        this.productName = data.name || 'No Name'; 
        this.price = data.price || 0; 
    } 
    getInfo() { 
        return `${this.productName} ${this.price}`; 
    } 
} 
 
console.log((new Product({price:758})).getInfo());

Answer 2

Думаю есть несколько способов это сделать

С помощью статических методов

class Product { 
  static fromPrice(price) { 
    return new this(null, price); 
  } 
 
  constructor(name, price) { 
    this.productName = name || 'No Name'; 
    this.price = price || 0; 
  } 
 
  getInfo() { 
    return `${this.productName} ${this.price}`; 
  } 
} 
 
console.log(Product.fromPrice(200).getInfo()); 
console.log(new Product('Main').getInfo());

Можно внутри конструктора определять по типу переменной, чем она является

class Product { 
  constructor() { 
    this.productName = 'No Name'; 
    this.price = 0; 
     
    // перебираем принятые аргументы 
    for (const arg of arguments) { 
      // проверяем тип аргумента 
      switch (typeof arg) { 
        // если тип является строкой 
        case 'string':  
          // то это имя продукта 
          this.productName = arg; 
          break; 
           
        // если число 
        case 'number': 
          // то цена 
          this.price = arg; 
          break; 
      } 
    } 
  } 
 
  getInfo() { 
    return `${this.productName} ${this.price}`; 
  } 
} 
 
console.log(new Product('Main').getInfo()); 
console.log(new Product(200).getInfo()); 
console.log(new Product(200, 'Main').getInfo());

Но как всегда остаётся один вопрос: зачем это нужно? Если это нужно, для того что бы ваш код никто и никогда не смог понять, тогда ладно. Если же вы хотите писать чисты и документируемый код, то предлагаю сделать так

/** 
 * Класс продукта 
 * @property {string} productName Наименование продукта 
 * @property {number} price Цена продукта 
 */ 
class Product { 
 
  /** 
   * @param {string} [name='No Name'] Наименование продукта 
   * @param {number} [price=0] Цена продукта 
   */ 
  constructor(name, price) { 
    this.productName = name || 'No Name'; 
    this.price = price || 0; 
  } 
 
  getInfo() { 
    return `${this.productName} ${this.price}`; 
  } 
} 
 
console.log(new Product(null, 200).getInfo()); 
console.log(new Product('Main').getInfo());

READ ALSO
Как поместить значения из таблицы в массив?

Как поместить значения из таблицы в массив?

Есть таблица, которая формируется php, но в каждой строке есть две ячейки с селектом, которые пользователь "заполняет" самостоятельноНужно...

296
Javascript нужно вставить в абзац символ

Javascript нужно вставить в абзац символ

Всем привет, у меня такая ситуацияЯ имею текст:

399