Объявления объектов с {}
представляют собой сокращенный синтаксис, скрывающий прототип объекта :
let obj = {}; // what you wrote
let obj = new Object() // what your JS interpreter sees
obj.prototype.object // what your JS interpreter creates
Это очень похоже на использование сокращенного синтаксиса class
. Но class
- это двойная абстракция , скрывающая тот факт, что он действительно создает функцию и что он делает это с помощью прототипа функции :
// what you wrote
class test{
constructor(x){
this.x = x;
}
}
// what your JS interpreter creates
test.prototype.constructor
Итак когда вы регистрируете obj
и получаете [object Object]
, ваш интерпретатор JS сообщает вам, что вы создали объект прототипа Object. Вы сбиваете себя с толку с помощью test
, просто остановитесь - они находятся в разных сферах и не означают одно и то же. Сначала изучите прототипы.
JS Под капотом
Следует помнить, что Javascript - объектно-ориентированный язык, но не использует наследование на основе классов, как большинство другое OOP. Javascript использует наследование прототипа . Когда вы создаете экземпляр класса в JS, это не совсем класс в классическом смысле программирования.
Повторюсь, ваш JS class
фактически определяется как функция. Попробуйте:
console.log(typeof test) //output: function
Но есть еще кое-что. Допустим, мы немного расширили ваш пример с помощью другого метода:
class test{
constructor(x){
this.x = x;
}
// Custom method
outputX() {
console.log(this.x)
}
}
Что мы на самом деле сделали? Как упоминалось выше, интерпретатор JS будет читать ваш класс и использовать прототип функции для его создания. Так чем же это отличается от простого определения функции?
Поскольку вы использовали class
, прототип функции автоматически назначает метод конструктора вашему новому test
прототипу. Все другие пользовательские методы, такие как outputX
, которые я добавил, добавляются в прототип test
.
// All valid
test.prototype.constructor
test.prototype.outputX
test.prototype.whateverMethodYouMake