class RandomObject {
  constructor() {
    this.method1 = function() {}
  }

  method2() {
    // only this is non enumerable
  }

  method3 = function() {}
}

const object = new RandomObject()

for (const prop in object) {
  console.log(prop) // 'method1', 'method2'
}

Odkryłem, że tylko method1 i method2 są drukowane w pętli for...in, co oznacza, że są one manewalne. Jednak method2 nie pojawia się w pętli, co oznacza, że nie jest niezliczone. Zastanawiam się, co tutaj spowodowało różnice? Dlaczego jest to tylko method2 nie jest niezliczona w tym przypadku?

Również odkryłem, że jeśli zdefiniuję metodę bezpośrednio w dosłownym obiektowym, jest ponownie wymienialny:

const object2 = {
  method2() {
    // Now this is enumerable
  }
}
2
Joji 9 luty 2021, 17:55

1 odpowiedź

Najlepsza odpowiedź

Metody prototypów klasowych są niezliczone - właśnie sposób zaprojektowany składnia:

class X {
  method() {
  }
}

console.log(Object.getOwnPropertyDescriptor(X.prototype, 'method').enumerable);

Zobacz CreatuTeMethodProperty w ClassDefinitionation, co wymaga niezlicela metod klasy.

W przeciwieństwie, składnia pola klasy - to jest, someProperty = someExpression bezpośrednio wewnątrz korpusu klasy - jest cukier składniowy do uruchomienia this.someProperty = someExpression wewnątrz konstruktora. Zwykłe zadanie do nieruchomości, która nie istnieje na obiekcie, ale powoduje, że nieruchomość jest nielimatyczna.

class RandomObject {
  method3 = function() {}
}

Jest równa

class RandomObject {
  constructor() {
    this.method3 = function() {}
  }
}

Z metodami na temat zwykłych obiektów, patrz PropertyDefinitionation, co opisuje, jak właściwości (w tym metody) Utworzono w literałach obiektów. To się przeprowadza

Powrót ? MetodaDefinitionation ocenie MetodeFinition z obiektem argumentowym i niezliczone.

Gdzie enumerable został ustawiony na true z ObjectLiterals.

3
CertainPerformance 9 luty 2021, 15:05