微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

在类的构造函数之外写一个字段是什么意思?

如何解决在类的构造函数之外写一个字段是什么意思?

我刚刚看完了一个视频,该视频讨论了一项新功能,该功能将使 js 能够支持私有字段和方法。 该视频试图解释字段和属性间的区别。 我理解它是否在类内部而不是在构造函数内部的方式是一个字段,但在构造函数内部它是一个属性但是我不明白有什么区别。 例如:

  class Account {
  locale = navigator.language;   //public **field**
  #movements = [];            //private **field**
  #pin;                       //private **field**

  constructor(owner,currency,pin) {
    this.owner = owner;          //**property**
    this.currency = currency;   //**property**
    this.#pin = pin;


    console.log(`Thanks for opening an account,${owner}`);
  }


  getMovements() {
    return this.#movements;
  }

  deposit(val) {
    this.#movements.push(val);
    return this;
  }

  withdraw(val) {
    this.deposit(-val);
    return this;
  }
}

区域设置、移动和大头针所有者和货币有什么区别?

enter image description here

解决方法

这是我对这一切的理解,

当您说字段、属性等时,您的意思基本上是相同的,即每当您创建类的实例时分配内存的变量。

但是要实例化或创建类的实例,您可能必须为该新对象提供一些属性

例如:想象一个 Person 类,

class Person {
   country = "USA"
   constructor(age,name) {
     this.age = age;
     this.name = name;
   }
}

let newPerson = new Person(18,"John");

为了争论,让我们考虑每个人都来自美国,因此我们只创建一个名为 country 的属性,并为其提供默认值“USA”

因此,对于每个创建的新对象,它都会具有以下属性:年龄、名称和国家/地区。 他们可以通过

访问
newPerson.age
newPerson.name
newPerson.country

这些基本上可以称为变量/属性等 但是 javascript 不像传统的 OO 语言那样试图做出修正是在类中引入私有变量,原因是

想象一下,对于 person 类,您希望有额外的逻辑,即输出该人是否成人的方法,通常您将创建一个方法并检查 this.age >= 18 是否并相应地输出,但为了参数起见我们将创建另一个变量来存储这个人是否成年

让我们将其设为布尔值,并将其默认为 true(同样,这都是糟糕的设计,但我们只是为了实验而这样做)

class Person {
   country = "USA"
   #isAdult = true

   constructor(age,name) {
     this.age = age;
     this.name = name;
   }

   isPersonAdult() {
      if(this.#isAdult) return `${this.name} is an adult`
      else `${this.name} is not an adult`
   }
}

let newPerson = new Person(18,"John");

我们没有处理逻辑来检查他是否真的是成年人

通常没有 # 符号(表示私有),我们可以使用 newPerson.isAdult 访问布尔值,但是我们的假设设计只是不想公开变量,因为如果为 false,则更改它同样容易可访问,因此这个主要目的是我们内部实现使用并且不一定定义人的变量可以称为字段

所以总而言之,不要混淆语义和两者之间的区别 变量在构造函数和外部被污染的是:

每当类被实例化时,您需要设置一些东西,这些设置在实例化期间作为 new Person(18,"John") 提供,但类不仅仅是提供的。 所以我们创建了我们自己的变量,并且可以将它放在任何地方并按照我们想要的方式初始化它,也许我们想根据提供的内容设置它的值,而不是直接询问要提供的变量,就像我们可以处理我们的 #isAdult 变量

   constructor(age,name) {
     this.age = age;
     this.name = name;
     if( age < 18 ) {
        this.#isAdult = false;
     }
   }

没有人应该关心我们如何确定一个人是否是成年人只关心有一个方法可以输出它是否是成年人,因此将变量标记为私有并在类中处理我们自己的逻辑

,

公共字段与普通属性相同。除了语法没有区别。

私有字段必须在类定义中声明(在constructor之外),不能通过赋值创建。

所有字段初始化(即您放在 = 之后的内容)都隐式移动到构造函数中,以便在构造实例时立即运行。

class Account {
  locale = navigator.language; // public field with initialisation
  #movements = [];             // private field with initialisation
  #pin;                        // private field

  constructor(owner,currency,pin) {
    this.owner = owner;        // property creation by assignment
    this.currency = currency;  // property creation by assignment
    this.#pin = pin;           // assignment


    console.log(`Thanks for opening an account,${owner}`);
  }
}

相同
class Account {
  #movements;
  #pin;

  constructor(owner,pin) {
    this.locale = navigator.language;
    this.#movements = [];
    this.#pin = undefined;

    this.owner = owner;
    this.currency = currency;
    this.#pin = pin;


    console.log(`Thanks for opening an account,${owner}`);
  }
}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。