Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/392.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何将类的实例添加到JavaScript对象中?_Javascript_Javascript Objects - Fatal编程技术网

如何将类的实例添加到JavaScript对象中?

如何将类的实例添加到JavaScript对象中?,javascript,javascript-objects,Javascript,Javascript Objects,我有一个如下所示的类 class test{ constructor(x){ this.x = x; } } 我创建了这个类的一个实例,并将其存储到变量temp中 let temp = new test(10); let obj = {}; obj[temp] = true; 我还有一个对象,我想把temp放在那里 let temp = new test(10); let obj = {}; obj[temp] = true; 但是当我看到obj时,它并

我有一个如下所示的类

class test{
    constructor(x){
        this.x = x;
    }
}
我创建了这个类的一个实例,并将其存储到变量
temp

let temp = new test(10);
let obj = {};
obj[temp] = true;
我还有一个对象,我想把
temp
放在那里

let temp = new test(10);
let obj = {};
obj[temp] = true;
但是当我看到obj时,它并没有包含我所期望的,它包含了

{[object Object]: true}
[object Object]: true
__proto__: Object
我不知道我哪里出了问题,
object object
代表什么,如有任何帮助,将不胜感激

更新:


如果我创建对象的另一个实例
let temp2=newtest(10)
并选中obj中的
temp2
返回
true
,obj中的
temp
返回
true

[object object object]
是JavaScript中对象的文本表示,某些打印机函数将打印出来,而不是遍历对象


也就是说,您不能期望能够使用一个对象(例如“{foo:123}”作为另一个对象的键(例如,“foo”是前面示例中的键)。它将被展平为一个带有键“object object”的字符串正如您所看到的,与打印机函数非常相似。

类实例由JS中具有类函数和属性的对象表示。进一步阅读,我创建了一个codesandbox,简要说明执行此操作时返回的数据类型是一个对象:

obj[temp] = true;

你实际上是把布尔值放在一个属性中,它的<强>键是一个对象,它被转换成一个字符串。

obj['embeddedObject'] = temp;

console.log(obj)

FYI下,对象存储属性(键值对),其中:属性键必须是字符串或符号(通常是字符串),并且值可以是任何类型。有关详细信息,请参阅此部分


在您的例子中,当您将
temp
作为属性键名放入
obj
时,
temp.toString()
被隐式调用,默认情况下实现返回
“[object object]”
。因为您的类test没有覆盖
toString()
方法和您创建的实例也temptemp2没有覆盖它,您总是会得到默认的实现返回值toString()。因此,对于obj中的
temp2和obj中的
temp
对象声明,您会得到相同的输出
是一种隐藏以下内容的速记语法:

这与使用
速记语法非常相似,隐藏了它实际上是在创建一个函数,并且它是通过以下方式创建的:

因此,当您记录
obj
并获得
[object object]
时,您的JS解释器会告诉您您已经创建了prototype object的对象。您将自己与
test
混淆,只需停止,它们在不同的范围内,并不意味着相同的事情。请先学习prototype

引擎盖下的JS 需要记住的是,Javascript是一种面向对象的语言,但不像大多数其他OOP那样使用基于类的继承

重申一下,您的JS
类实际上被定义为一个函数。请尝试一下:

console.log(typeof test) //output: function
不过还有更多。假设我们用另一种方法进一步扩展您的示例:

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

  // Custom method
  outputX() {
    console.log(this.x)
  }
}
我们到底做了什么?如上所述,JS解释器将读取您的类并利用创建它。那么,这与仅仅定义一个函数有什么不同呢

由于您使用了
,函数原型会自动将构造函数方法分配给新的
测试
原型。所有其他自定义方法(如我添加的
outputX
)都会添加到
测试
原型中

// All valid
test.prototype.constructor
test.prototype.outputX
test.prototype.whateverMethodYouMake

@SomShekharMukherjee为我之前的回答道歉。查看我的更新a,我还发现使用对象作为键是错误的,因为它是可变的。