Как добавить экземпляр класса в объект JavaScript? - PullRequest
2 голосов
/ 19 июня 2020

У меня есть класс, как показано ниже

class test{
    constructor(x){
        this.x = x;
    }
}

И я создал экземпляр этого класса и сохранил его в переменной temp.

let temp = new test(10);

И у меня также есть объект, в который я sh помещаю temp.

let obj = {};
obj[temp] = true;

Но когда я вижу obj, он не содержит того, что я ожидал, он содержит

{[object Object]: true}
[object Object]: true
__proto__: Object

Я не могу понять, где я ошибаюсь, что означает object Object, любая помощь будет принята с благодарностью.

ОБНОВЛЕНИЕ:

Если я создам другой экземпляр объекта let temp2 = new test(10); и проверьте temp2 in obj, он возвращает true, а также temp in obj возвращает true.

Ответы [ 6 ]

2 голосов
/ 19 июня 2020

[object Object] - текстовое представление для объектов в JavaScript, которое определенные функции принтера будут распечатывать вместо обхода объекта.

Тем не менее, вы не можете ожидать, что сможете использовать объект (например, «{foo: 123}» в качестве ключа другого объекта (например, «foo» - это ключ в предыдущем примере). будет сведено к строке с ключом «объект Object», как вы видели, во многом как функция принтера.

0 голосов
/ 19 июня 2020

Объявления объектов с {} представляют собой сокращенный синтаксис, скрывающий прототип объекта :

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
0 голосов
/ 19 июня 2020

FYI, Объект хранит свойства (пары ключ-значение), где: Ключи свойств должны быть строками или символами (обычно строками), а Значения могут быть любого типа. Для получения дополнительной информации вы можете go через это обсуждение .

В случае, когда вы помещаете temp в obj в качестве имени ключа свойства, temp.toString() вызывается неявно и по умолчанию реализация возвращает "[object Object]". Поскольку ваш класс test не переопределяет метод toString(), а ваши созданные экземпляры также temp и temp2 не переопределяют его, вы всегда получаете реализацию по умолчанию возвращаемое значение toString () . Таким образом, вы получите одинаковый результат для temp2 in obj и temp in obj.

0 голосов
/ 19 июня 2020

Когда вы это делаете:

obj[temp] = true;

Фактически вы помещаете логическое значение в свойство с его ключом , являющимся объектом, который преобразуется в строку. Подумайте, действительно ли вам нужно:

obj['embeddedObject'] = temp;

Что имеет больше смысла в console.log(obj).

0 голосов
/ 19 июня 2020

Тип данных того, что вы возвращаете, - это Object

0 голосов
/ 19 июня 2020

Экземпляры классов представлены объектами с функциями и атрибутами класса в JS. Прочтите также Classes by MDN Я создал codeandbox, чтобы вкратце проиллюстрировать это https://codesandbox.io/s/cocky-wood-9fk4x?file= / src / index. js

...