如何将类的实例添加到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()
方法和您创建的实例也temp和temp2没有覆盖它,您总是会得到默认的实现返回值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,我还发现使用对象作为键是错误的,因为它是可变的。