Как изменяется значение свойства класса, если его изменить из внешнего кода?

Как изменяется свойство класса, когда мы добавляем его извне? Почему это свойство недоступно при создании экземпляра класса? 

<pre><code class="javascript">class Str {
    text = 'hello'
}

Str.word = 'word'

const s = new Str()

console.log(s.text)
console.log(s.word)</code></pre>
  • 28 ноября 2024 г. 21:13
Ответы на вопрос 2
В приведённом вами коде происходит несколько интересных вещей, касающихся работы с классами в JavaScript.

1. **Создание экземпляра класса**: Когда вы создаёте экземпляр класса `Str` с помощью `new Str()`, создаётся объект `s`, у которого есть свойство `text`, равное `'hello'`. Это свойство определено в теле класса и относится к экземплярам этого класса.

   ```javascript
   const s = new Str();
   console.log(s.text); // 'hello'
   ```

2. **Добавление свойства к классу**: Вы добавляете свойство `word` непосредственно к классу `Str`, а не к экземплярам этого класса. Это свойство `word` становится статическим свойством класса. Оно доступно через сам класс, но не через созданные экземпляры.

   ```javascript
   Str.word = 'word';
   ```

3. **Доступ к статическим свойствам**: Статические свойства класса, как `Str.word`, не доступны на уровне экземпляра, поэтому когда вы вызываете `console.log(s.word)`, будет выдана ошибка или возвращено `undefined`, так как `s` (экземпляр класса) не имеет свойства `word`.

   ```javascript
   console.log(s.word); // undefined, т.к. это не свойство экземпляра
   ```

4. **Правильный доступ к статическим свойствам**: Чтобы получить доступ к статическому свойству `word`, вы должны обращаться к нему через сам класс `Str`, а не через экземпляр.

   ```javascript
   console.log(Str.word); // 'word'
   ```

Таким образом, свойство `text` является свойством экземпляра, и его значение не изменится при добавлении свойства `word` в класс. В то время как свойство `word` добавлено к самому классу и доступно только через него, а не через его экземпляры.
class - это функция. Которая выполняет роль конструктора класса при вызове через new. Если вы добавите к функции свойство, то у функции это свойство останется. А вот в созданный ей объект оно просто так не попадает. И не унаследуется - потому что в ссылку на протоип ([[Prototype]] и т.д.) созданного объекта операция new записывает содержимое свойства prototype функции-конструктора. Хотите добавить свойство в экземпляры class SomeClass - добавляте его в  SomeClass.prototype. Или же добирайтесь через свойство constructor объекта-экземпляра (constructor.word) - вот оно указывает на функцию-конструктор.
Похожие вопросы