【问题标题】:Javascript object constructor function argumentsJavascript 对象构造函数参数
【发布时间】:2020-12-18 04:17:11
【问题描述】:

我可以在构造函数中使用变量而不在函数参数中使用它吗?

如下所示:

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(name, height, weight),在里面我有 this.bmi 吗?函数怎么知道这里的bmi是什么?

【问题讨论】:

  • 是的,您也可以有其他函数范围的变量,即使用varletconst 等定义,没有什么可以限制构造函数中的变量使用/定义
  • 构造函数没有什么特别之处,只是当你使用new时它们会被自动调用。构造函数可以对对象做任何其他方法可以做的事情。
  • 你是在问能不能做var bmi = null; this.calculateBMI = function() { if (bmi===null)...

标签: javascript


【解决方案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);

虽然,也许你想看看 getter 和 setter: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Functions/set

这将允许您在每次更新 heightweight 时更新 bmi。例如,如果heightweight 发生变化,以下内容将更新bmi

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);

【讨论】:

  • 我的问题正好相反。如果我在函数参数中没有“bmi”,例如 Person(姓名、身高、体重),我可以在函数中包含 this.bmi 吗?
  • 是的,我已经更新了从参数中删除 bmi 的答案