Аргументы функции конструктора объектов Javascript

#javascript

#javascript

Вопрос:

Могу ли я иметь переменную в функции конструктора, не имея ее в аргументе функции?

как показано ниже:

 function Person(name,height,weight){
this.name=name;
this.height=height;
this.weight=weight;
this.bmi=null;
this.calculateBMI = function()
{
    if (this.bmi===null){
        this.bmi = this.weight / (Math.pow(this.height,2));
    }
    return this.bmi;
}
}
var person1 = new Person("alayna",23, 56)
  

могу ли я иметь функцию Person(имя, рост, вес), а внутри нее у меня есть this.bmi? как функция узнает, что такое bmi здесь?

Комментарии:

1. Да, у вас могут быть и другие переменные, охватываемые функцией, т. Е. Определенные с var помощью , let , const и т. Д. Нет ничего, что ограничивало бы использование / определение переменных в функциях конструктора

2. В конструкторах нет ничего особенного, за исключением того, что они вызываются автоматически при использовании new . Конструктор может делать с объектом все, что может любой другой метод.

3. Вы спрашиваете, можете ли вы сделать var bmi = null; this.calculateBMI = function() { if (bmi===null)...

Ответ №1:

Вы можете выбрать, использовать значение параметра или нет

 function Person (name, height, weight) {
  this.name = name;
  this.height = height;
  this.weight = weight;
  this.bmi = this.weight / (Math.pow(this.height, 2));
}

Person.prototype.calculateBMI = function() {
  this.bmi = this.weight / (Math.pow(this.height, 2));
  return this.bmi;
}

var person1 = new Person("alayna",23, 56);
  

Хотя, возможно, вы хотите посмотреть на геттеры и сеттеры:
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Functions/set

Который позволит вам обновлять bmi каждый раз height или weight обновляется. Например, следующее обновит bmi , если либо height или weight когда-либо изменится

 class Person {
  constructor(name, height, weight) {
    this.name = name;
    this._height = height;
    this._weight = weight;
    this.bmi = this._weight / (Math.pow(this._height, 2));
  }
  
  get weight() {
    return this._weight;
  }
  
  set weight(value) {
    this._weight = value;
    this.bmi = value / (Math.pow(this._height, 2));
  }
  
  get height() {
    return this._height;
  }
  
  set height(value) {
    this._height = value;
    this.bmi = this._weight / (Math.pow(value, 2));
  }
}

const person1 = new Person('alayna', 23, 56);
console.log(person1.bmi);
person1.height = 25;
console.log(person1.bmi);
  

Комментарии:

1. Мой вопрос заключается в обратном. Если у меня нет ‘bmi’ в аргументе функции, например Person (имя, рост, вес), могу ли я иметь this.bmi внутри функции?

2. Да, я обновил ответ, чтобы удалить bmi из параметров